Как представить контроллер представления из другого контроллера представления - PullRequest
3 голосов
/ 30 января 2012

Я пытаюсь открыть ViewController из другого ViewController, если выполняются определенные условия. Код выполняется без ошибок, но представление никогда не отображается. Я новичок в xcode 4 / ios 5, поэтому я должен что-то упустить.

Вот код, отвечающий за открытие второго viewcontroller:

CreateUserViewController *createUserController = [[CreateUserViewController alloc] initWithNibName:@"CreateUserView" bundle:[NSBundle mainBundle] keyWrapper:keyChainWrapper];

    [self presentViewController:createUserController animated:YES completion:nil];

В моем проекте у меня есть xib под названием «CreateUserView». Я добавил контроллер представления к этой XIB и назначил его «CreateUserViewController».

Также я заметил в документации по apple, которая показывает установку делегата viewcontroller, который будет представлен. Но кажется, что ни одно свойство с именем «делегат» не находится в объекте viewcontroller. Эта документация старая? Это документ, который я пытаюсь использовать (раздел 9-1):

Просмотр программирования контроллера

Может кто-нибудь дать мне подсказку? Спасибо ..

edit Добавление пользовательского конструктора

    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil keyWrapper:(KeychainItemWrapper *)keyWrapper
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        [self setKeyChainWrapper:keyWrapper];
    } 
             return self;
}

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Относительно CreateUserView.xib: вы не хотите помещать объект CreateUserViewController в перо.Вы хотите установить для пользовательского класса заполнителя владельца файла значение CreateUserViewController.Затем вам нужно подключить выход view Владельца файла к представлению верхнего уровня в кончике.

Относительно свойства delegate: класс UIViewController не имеет своего собственного delegateимущество.Идея состоит в том, что вы добавляете свойство delegate к своему подклассу UIViewController.Делегат предоставляет способ для вашего представленного контроллера представления передавать пользовательскую информацию обратно в представляющий контроллер представления.

Зачем вам это нужно?Давайте рассмотрим код, который вы разместили.Я предполагаю, что у вас есть UserListViewController, который показывает список объектов пользователя и имеет кнопку «Создать нового пользователя».Когда пользователь касается кнопки «Создать нового пользователя», вы создаете CreateUserViewController и представляете его.

Пользователь взаимодействует с CreateUserViewController, чтобы установить атрибуты нового объекта пользователя - имя, ранг,прическа и т. д. Затем он нажимает кнопку «Готово».Ваш CreateUserViewController создает новый объект User и помещает его в базу данных.Затем он должен сам себя закрыть, поэтому список пользовательских объектов UserListViewController появится снова.

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

Вы определяете протокол следующим образом:

@protocol CreateUserViewControllerDelegate

- (void)didCreateUser:(User *)user;

@end

, и вы присваиваете свойству CreateUserViewController a delegate:

@interface CreateUserViewController

@property (weak, nonatomic) id<CreateUserViewControllerDelegate> delegate;

// ...

Когда вы нажимаете кнопку «Готово» CreateUserViewController, вы уведомляете своего делегата о новом Пользователе:

- (IBAction)doneButtonWasTouched:(id)sender {
    User *user = [self createUser];
    [self.delegate didCreateUser:user];
    [self dismissViewControllerAnimated:YES completion:nil];
}

В вашем UserListViewController вы принимаете и внедряете протокол:

@interface UserListViewController <CreateUserViewControllerDelegate, UITableViewDelegate, UITableViewDataSource>

// ...

@end

@implementation UserListViewController

- (void)didCreateUser:(User *)user {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.users count] inSection:0];
    [self.users addObject:user];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation: UITableViewRowAnimationAutomatic];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition: UITableViewScrollPositionNone animated:YES];
}

и когда вам нужно представить CreateUserViewController, вы устанавливаете делегату нового контроллера значение UserListViewController:

- (IBAction)createUserButtonWasTouched:(id)sender {
    CreateUserViewController *createUserController = [[CreateUserViewController alloc] initWithNibName:@"CreateUserView" bundle:[NSBundle mainBundle] keyWrapper:keyChainWrapper];
    createUserController.delegate = self;
    [self presentViewController:createUserController animated:YES completion:nil];
}
1 голос
/ 30 января 2012

В iOS5 метод добавления новых контроллеров представления действительно немного изменился по сравнению с iOS4 и Xcode 3. Итак, раскадровки теперь используются для создания потока контроллера представления приложения.Несмотря на то, что вы можете использовать автономные файлы .xib для создания приложения, в iOS5 это встречается гораздо реже.

В любом случае, основной метод вывода новых контроллеров представления на экран - использование сегментов.Ознакомьтесь с этим руководством для ознакомления: http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

Он хорошо объясняет, как создать раскадровку и использовать сегы.Вы по-прежнему можете представлять контроллеры представления в коде «по-старому», но теперь с появлением этих новых технологий это встречается гораздо реже.В iTunes U также есть несколько великолепных учебников - поищите CS193P.Это Стэнфордский вводный класс для Objective-C и программирование для iOS.Это должно помочь вам начать работу и, возможно, помочь вам придумать способ повысить скорость работы вашего createUserController с помощью iOS5.

ОБНОВЛЕНИЕ

Я простохотел добавить.Если вы сконфигурировали свою программу для использования раскадровок и сегментов, вы можете использовать метод performSegueWithIdentifier:sender:, чтобы выполнить переход к вашему представлению createUserController, если соблюдены надлежащие условия.См. Apple API для UIViewController для получения информации о том, как использовать этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...