Правильный доступ к контроллеру представления назначения перехода для назначения делегатов протокола

Я столкнулся с некоторыми проблемами при интеграции перехода и протоколов при реализации списка выбора.

В моем списке выбора .h у меня есть:

#import <UIKit/UIKit.h>

@protocol SelectionListViewControllerDelegate <NSObject>
@required
- (void)rowChosen:(NSInteger)row;
@end

@interface SelectColor : UITableViewController <NSFetchedResultsControllerDelegate>
-(IBAction)saveSelectedColor;
@property (nonatomic, strong) id <SelectionListViewControllerDelegate> delegate;
@end

В моем списке выбора .m у меня есть:

@implementation SelectColori
@synthesize delegate;

//this method is called from a button on ui
-(IBAction)saveSelectedColore
{
    [self.delegate rowChosen:[lastIndexPath row]];
    [self.navigationController popViewControllerAnimated:YES];
}

Я хотел бы получить доступ к этому представлению списка выбора, выполнив переход из другого представления таблицы:

@implementation TableList
...
- (void)selectNewColor
{
    SelectColor *selectController = [[SelectColor alloc] init];
    selectController.delegate = (id)self;
    [self.navigationController pushViewController:selectController animated:YES];

    //execute segue programmatically
    //[self performSegueWithIdentifier: @"SelectColorSegue" sender: self];
}

- (void)rowChosen:(NSInteger)row
{
    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Error Title" message:@"Error Text" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

Если я перейду к списку выбора, используя:

[self.navigationController pushViewController: selectController анимированный: YES];

предупреждение отображается. Если я вместо этого использую:

[самостоятельно выполнитьSegueWithIdentifier: @"SelectColorSegue" отправитель: self];

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


person yassassin    schedule 16.12.2011    source источник


Ответы (1)


При использовании Segue для передачи данных в targetViewController вам необходимо использовать метод

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"SelectColorSegue"]) {
        SelectColor *vc = segue.destinationViewController;
        vc.delegate = self;
    }
}

из документов Apple

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

person agilityvision    schedule 16.12.2011