2017-01-11 3 views
0

У меня есть UITableViewController, созданный с помощью раскадровки. Than У меня есть якорь, который вызывает popOver, созданный с помощью раскадровки. Popover - это другой UItableViewController, когда я нажимаю на строку, я должен перезвонить первому контроллеру и передать объект. Я попытался это в поповер объекта:вызовите popover и отправьте обратно переменную в предыдущий uiview

  • (аннулируются) prepareForSegue: (UIStoryboardSegue *) переход отправителя (идентификатор) отправителя {

    если ([[идентификатор Segue] isEqualToString: @ "Фортуна «]) {

    NSIndexPath *indexPath = (NSIndexPath *)sender; 
    
    ASFortuneTeller * aController = [segue destinationViewController]; 
    [aController setWYPT:[allWYPTs objectAtIndex:indexPath.row]]; 
    

    }}

В основном Мне нужно передать пакет NSMutableDictionary в первый UITableViewController. Но я заметил, что таким образом я создаю новый объект ASFortuneTeller, это не то, что я хочу ... Я хочу просто перезвонить первому контроллеру и передать объект.

Как я могу это сделать?

ответ

1

Быстрое решение (когда речь идет всегда одни и те же два класса) могут быть:

В файле .h первого контроллера представления, определить метод (или просто свойство):

-(void)selectedWYPT:(NSMutableDictionary*)wypt; 

В файле .h вашего второго контроллера представления сделать свойство

@property FirstUIViewController *firstView; 

В первом контроллере представления, то откроется второй контроллер представления через Segue, так что вы можете у себе:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"segueIdentifier"]) { 
     SecondUIViewController *destination = segue.destinationViewController; 
     destination.firstView = self; 
    } 
} 

Когда строка выбрана во втором окне вы можете использовать

if (self.firstView)  
    [self.firstView setWYPT:[allWYPTs objectAtIndex:indexPath.row]]; 

передать данные обратно на первый взгляд.

Как было сказано, это было бы быстрым решением, когда бывают задействованы те же самые два класса.

Другой способ - использовать протоколы. Когда первый контроллер представления не всегда будет FirstUIVierController, вы можете использовать что-то вроде этого:

SecondUIViewController.h

@class SecondUIViewController; 
@protocol SecondUIViewControllerDelegate <NSObject> 

-(void)secondUIViewController:(SecondUIViewController*)controller didSelectWYPT:(NSMutableDictionary*)wypt; 

@end 

@interface SecondUIViewController : UIViewController 

@property id<SecondUIViewControllerDelegate> delegate; 

@end 

SecondUIViewController.m

где выбрана строка:

if (self.delegate && [self.delegate respondsToSelector:@selector(secondUIViewController:didSelectWYPT:)]) 
    [self.delegate secondUIViewController:self didSelectWYPT:[allWYPTs objectAtIndex:indexPath.row]]; 

AnyOtherUIViewController.ч

#import "SecondUIViewController.h" 

@interface AnyOtherUIViewController : UIViewController <SecondUIViewControllerDelegate> 

... 
... 

AnyOtherViewController.m

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

-(void)secondUIViewController:(SecondUIViewController*)controller didSelectWYPT:(NSMutableDictionary*)wypt { 
    //do something with the data 
} 
+0

Очень хорошо объяснено и реализовано решение. :) –

+0

спасибо за объяснение ... но свойство возвращает ошибку: Неизвестное имя типа ... в файле .h есть #import "nameOftheClass.h" реализовано ... – yorh

+0

Другая проблема заключается в том, что popover не исчезает, когда Я нажимаю на строку ... – yorh

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