iOS dev - UINavigationController: отправлять данные в обратном направлении во второе родительское представление - PullRequest
0 голосов
/ 03 декабря 2011

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

RootViewController.h

#import <UIKit/UIKit.h>
#import "ThirdViewController.h"

@class SecondViewController;

@interface RootViewController : UIViewController <PassInt>

@property (strong, nonatomic) SecondViewController *secondViewController;
@property (strong, nonatomic) ThirdViewController *thirdViewController;
@property (nonatomic) int intNumber;

@end

RootViewController.m

#import "RootViewController.h"
#import "SecondViewController.h"

@implementation RootViewController

@synthesize secondViewController = _secondViewController;
@synthesize thirdViewController = _thirdViewController;
@synthesize intNumber = _intNumber;

- (void)setIntNumber:(int)number{
    _intNumber = number;
}

#pragma mark - View lifecycle

- (void)viewWillAppear:(BOOL)animated {
    if(!_thirdViewController){
        _thirdViewController = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:[NSBundle mainBundle]];
    }
    if(!_secondViewController){
        _secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];
        self.secondViewController.thirdViewController = self.thirdViewController;
    }
    [self.navigationController pushViewController:self.secondViewController animated:YES];
    }

@end

SecondViewController.h

#import <UIKit/UIKit.h>

@class ThirdViewController;

@interface SecondViewController : UIViewController

@property (strong, nonatomic) ThirdViewController *thirdViewController;

@end

SecondViewController.m

#import "SecondViewController.h"
#import "ThirdViewController.h"

@implementation SecondViewController

@synthesize thirdViewController = _thirdViewController;

...

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
        [self.navigationController pushViewController:self.userPreferencesViewController animated:YES];
}
@end

ThirdViewController.h

#import <UIKit/UIKit.h>

@protocol PassInt <NSObject>
@required
- (void) setIntNumber:(int)number;
@end

@interface ThirdViewController : UIViewController{
id <PassInt> delegate;
}
@property (retain) id delegate;
- (IBAction)saveChanges;

@end

ThirdViewController.m

#import "ThirdViewController.h"

@implementation ThirdViewController

- (IBAction)saveChanges{
    int someInt = 3;
    [[self delegate] setIntNumber:someInt];
    UINavigationController *tempNavigationController = self.navigationController;
    [tempNavigationController popViewControllerAnimated:NO];
    [tempNavigationController popViewControllerAnimated:NO];
}
...
@end

Буду признателен за любую помощь!

Ответы [ 3 ]

0 голосов
/ 04 декабря 2011

Другим способом может быть использование NSNotifications.Получите регистрацию RootViewController в качестве наблюдателя за уведомлением, опубликованным ThirdViewController.Затем в словаре userInfo уведомления, публикуемого ThirdViewController, вы передаете someInt как NSNumber.

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

Удачи

0 голосов
/ 04 декабря 2011

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

0 голосов
/ 04 декабря 2011

В ссылке UINavigationController проверьте вызов свойства:

@property(nonatomic, copy) NSArray *viewControllers

Обсуждение
Контроллер корневого представления имеет индекс 0 в массиве, контроллер заднего обзора - индекс n-2, а верхний контроллер - индекс n-1, где n - количество элементов в массиве.

Это может дать вам дескриптор rootViewController.
Это было бы хорошим решением для вас?
Есть другие способы. Но из вашего комментария я думаю, что это может быть совпадением.


[[self.navigationController viewControllers] objectAtIndex:0].someProerty;

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