Всплывающее модальное с UITableView на iPhone - PullRequest
3 голосов
/ 24 марта 2010

Мне нужно всплыть быстрый диалог, чтобы пользователь мог выбрать один вариант в UITableView из списка примерно из 2-5 элементов. Диалог будет модальным и займет всего около половины экрана. Я иду вперед и назад между тем, как справиться с этим. Должен ли я создать подкласс UIView и сделать его UITableViewDelegate & DataSource?

Я бы также предпочел выложить эту точку зрения в IB. Таким образом, чтобы отобразить, я бы сделал что-то вроде этого из моего контроллера представления (предположим, у меня есть свойство в моем контроллере представления для DialogView *myDialog;)

NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"DialogView" owner:myDialog options:nil];
myDialog = [nibViews objectAtIndex:0];
[self.view addSubview:myDialog];

проблема в том, что я пытаюсь передать владельца: myDialog, который равен nil, поскольку он не был создан ... я мог передать владельца: self, но это сделало бы мой контроллер вида File's Owner, и это не то, как этот диалог вид подключен в IB.

Так что это заставляет меня думать, что это диалоговое окно хочет быть еще одним полноценным UIViewController ... Но из всего, что я прочитал, у вас должен быть только ОДИН UIViewController на экран, так что это смущает меня, потому что я мог бы извлечь выгоду из viewDidLoad и т. д., которые поставляются вместе с контроллерами вида ...

Может кто-нибудь, пожалуйста, поправьте это для меня?

1 Ответ

7 голосов
/ 24 марта 2010

Нет такого понятия, как контроллер вида на экране; его view находится на экране. С учетом сказанного вы можете одновременно отображать на экране столько представлений, сколько хотите.

Я бы создал новый контроллер вида и вида. Вы не станете UIView быть UITableViewDelegate, вы сделаете UIViewController быть UITableViewDelegate. Но вместо того, чтобы делать это вручную, вместо этого сделайте ваш новый контроллер представления подклассом UITableViewController, если вы используете iPhone OS 3.x +. Затем вы можете представить этот контроллер вида модально.

Вы, вероятно, хотите дать пользователю возможность отменить выбор. Хороший способ сделать это - обернуть ваш новый контроллер диалогового окна в UINavigationController и затем поместить кнопку «Отмена» в навигационную панель. Затем используйте шаблон делегата, чтобы сообщить родительскому контроллеру представления, что пользователь сделал свой выбор, чтобы вы могли вытолкнуть стек.

Вот как будет выглядеть код в вашем родительском контроллере представления, когда вы хотите представить этот диалог параметров:

- (void)showOptionView
{
    OptionViewController* optionViewController = [[OptionViewController alloc] initWithNibName:@"OptionView" bundle:nil];
    optionViewController.delegate = self;
    UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:optionViewController];
    [self.navigationController presentModalViewController:navController animated:YES];
    [navController release];
    [optionViewController release];
}

Ваш OptionViewController .h будет выглядеть так:

@protocol OptionViewControllerDelegate;

@interface OptionViewController : UITableViewController
{
    id<OptionViewControllerDelegate> delegate;
}

@property (nonatomic, assign) id<OptionViewControllerDelegate> delegate;

@end

@protocol OptionViewControllerDelegate <NSObject>
- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSString*)selection;
// or maybe
- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSUInteger)selection;
// etc.
@end

Ваш OptionViewController.m будет выглядеть примерно так:

- (void)madeSelection:(NSUInteger)selection
{
    [delegate OptionViewController:self didFinishWithSelection:selection];
}

У которого есть метод сопоставления в вашем исходном контроллере вида, например:

- (void)OptionViewController:(OptionViewController*)OptionViewController didFinishWithSelection:(NSUInteger)selection
{
    // Do something with selection here

    [self.navigationController dismissModalViewControllerAnimated:YES];
}

Существует множество примеров в исходном коде Apple, которые следуют этому общему шаблону.

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