2010-03-03 4 views
0

В настоящее время я работаю над приложением iPhone, которое запрашивает у пользователя данные для входа, проверяет эту информацию и представляет пользователю табличное представление их информации.Модальные представления и делегирование

При запуске делегат приложения запускает пустой вид в виде таблицы вместе с модальным видом, чтобы запросить учетные данные для входа. Учетные данные для входа состоят из стандартного поля имени пользователя и пароля и кнопки для отправки информации на сервер.

Когда учетные данные пользователей были проверены, я хочу отправить сообщение в TableView под именем LoginView, в котором говорится: «Привет, учетные данные пользователей были проверены, не могли бы вы собрать все данные для этого пользователя и отклонить контроллер вида? «. Я просмотрел несколько руководств от Apple, в частности, пример таблицы рецептов (использует делегирование для добавления рецептов), однако метод, который я реализую, никогда не выполняется и надеялся, что кто-то может пролить свет на мою проблему.

LoginViewController.h

@protocol GatherDataDelegate; 

@interface LoginViewController : UIViewController { 
    //lots of ivars 
    id <GatherDataDelegate> delegate; 

    //more ivars 
} 
//other properties 
@property (nonatomic, assign) id <GatherDataDelegate> delegate; 
@end 

@protocol GatherDataDelegate <NSObject> 
- (void)gatherForUserName:(NSString *)userName gatherForPassword:(NSString *)password; 
@end 

LoginViewController.m

else if ([dataString isEqualToString:@"Credentials Verified"]){ 
     [self.delegate gatherForUserName:username gatherForPassword:password] 
    } 

TableView.h

@interface RootViewController : UITableViewController <GatherDataDelegate> 

// Ивар и свойства

TableView.h

- (void)gatherForUserName:(NSString *)userName gatherForPassword:(NSString *)password; 
    NSLog(@"calling gather"); 
} 

Это, наверное, что-то глупое, что мне не хватает, как я уже сказал, у меня нет большого опыта использования делегирования, но я вижу много сообщений об этом. Благодарим за любую помощь заранее и найдите время, чтобы прочитать это.

+0

Где вы создаете и настройки делегата? – willcodejavaforfood

+0

Спасибо за ответ, я отвечу на этот ответ ниже bpap, так как у них были похожие вопросы. – Convolution

ответ

1

Похоже, вы все сделали правильно - вы создали протокол, внедрили его и отправили сообщение делегату ... немой вопрос ... вы уверены, что после его создания вы установите свойство делегата LoginViewController?

+0

Возможно, еще один глупый вопрос, но в моем делете приложения я создаю LoginViewController и снабжу его контроллером навигации в функции applicationDidFinishLaunching.После того, как я создал LoginViewController, я установил делегат для себя, но он дает мне предупреждение, что (myproject) AppDelegate не реализует GatherDataDelegate. Неужели это плохая практика представить это в AppDelegate таким образом? – Convolution

+0

ОК, так вот в чем проблема. Вы устанавливаете делегат LoginViewController в себя в AppDelegate, что означает, что вы сами устанавливаете AppDelegate как делегата. Но согласно приведенному выше коду, ваш делегат должен быть RootViewController, поскольку он реализует GatherDataDelegate. – bpapa

+0

Спасибо за помощь Bpapa, это было то место, где я ошибался, хотя благодаря дизайнерской критике TechZen я собираюсь что-то изменить в своей функциональности приложения. – Convolution

0

Ваша попытка передать данные между двумя контроллерами представления, что является плохой практикой. Вместо этого вам нужен объект модели данных, с которым взаимодействуют оба представления.

Во-первых, контроллер входа в систему запросит модель данных для соответствующей информации для входа. Если он будет проверен, модель данных установит этого пользователя в качестве текущего пользователя в модели данных, чтобы любые будущие данные извлекали возвращаемые данные для этого пользователя.

Во-вторых, когда контроллер табличного представления загружается, он просто спрашивает модель данных для информации для пользователя, сама модель данных будет контролировать, какие данные пользователя она возвращает на основе предыдущего входа контроллера входа. диспетчер tableview должен знать, как читать и отображать эту информацию пользователя, ничего больше.

Такая конструкция красиво и аккуратно, и вы можете добавить на дополнительные мнения без необходимости держать постепенно связующей все контроллеры просмотра вместе (который будет снежный ком.)

+0

Хорошо, поэтому с точки зрения дизайна вы считаете, что мне будет проще сделать класс CurrentUser. И установите этот класс с помощью контроллера входа и прочитайте TableView. Хорошо, что имеет больше смысла. Я не знаю никаких других приложений, у которых есть система онлайн-входа, кроме фейсбука. В будущем я хочу, чтобы пользователь мог сохранять свою информацию, поэтому им не нужно входить в систему каждый раз. Спасибо за совет. – Convolution

+0

Другой тип глупого вопроса. Я беру ваш совет в создании объекта модели данных для текущего пользователя. Если мое табличное представление полностью загружено, так как оно представляет собой окно входа в систему, как только учетные данные будут проверены, как это известно для загрузки данных пользователей? Появляется ли в представлении регистрации сообщение делегата, в котором говорится: «Посмотрите на текущий пользовательский объект, у него есть некоторые данные, которые могут вам показаться интересными?» или я иду об этом неправильно. Это делает это, перезагружая данные в таблице? – Convolution

+0

Вопрос Bpapa решил мою непосредственную проблему, но спасибо TechZen, я собираюсь внедрить модель данных между двумя контроллерами представлений. – Convolution

Смежные вопросы