我是初学者程序员,这适用于xcode - iPhone。虽然我做了很多我的iPhone应用程序,但我似乎缺乏对简单通信如何工作的理解。
特别是当我有2个ViewControllers时。
我从另一个ViewController调用ViewController的一个函数。两者都在tabbarController下。我想要实现的是当我在ViewA中,在点击tableCell之后,我应该调用ViewB的方法,并且ViewB的NavigationBar推送到viewDetail。
以下是我正在使用的代码 在 ViewControllerA.h (我正在调用方法)
@class ViewControllerB;
@interface SmartDDxViewController : UIViewController {
IBOutlet UITableView *tableView;
ViewControllerB *xViewController;
}
@property (nonatomic, retain) UITableView *tableView;
@property (nonatomic, retain) ViewControllerB *xViewController;
这就是我用它来调用它.. ViewControllerA.m
ViewControllerB *ddViewController = [[ViewControllerB alloc] init];
self.xViewController = ddViewController;
[xViewController InitialiseDetailWithId:2 title:@"HEYA"];
继承了InitialiseDetailWithId代码:在 ViewControllerB.m
-(void)InitialiseDetailWithId:(NSInteger)pkey title:(NSString *)tt{
NSLog(@"InitialiseDetailC=========================================");
AppDelegate *appDelegate = (Smart_DifferentialsAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate GetConditionDetailsWithId:pkey];
DDisViewController *viewController= [[DDisViewController alloc] initWithNibName:@"DetailView" bundle:nil];
viewController.title = tt;
[self.NavBar pushViewController:viewController animated:YES];
//[tt release];
[viewController release];
viewController = nil;
[self say:@"HEYA"]; //this is ALERTVIEW box that displays HEYA
}
我正在获取所有信息,并且会显示alertview。但是当我在TabBar中选择View时,它没有被推动。
答案 0 :(得分:1)
不要在视图控制器之间使用直接访问,而是使用委托模式。像这样定义你的控制器:
@protocol ViewControllerAInitDelegate;
@interface ViewControllerA : UIViewController {
IBOutlet UITableView *tableView;
id<ViewControllerAInitDelegate> initDelegate;
}
@property (nonatomic, retain) UITableView *tableView;
@property (nonatomic, assign) ViewControllerAInitDelegate *initDelegate;
@end
@protocol ViewControllerInitDelegate
-(void)initializeDetailWithId:(NSInteger)pkey title:(NSString)tt;
@end
所以在
现在让您的应用程序委托符合ViewControllerInitDelegate
协议。看起来应该是这样的:
@interface AppDelegate : NSObject <UIApplicationDelegate, ViewControllerInitDelegate> {
IBOutlet UITabBarControler* tabBarController;
IBOutlet ViewControllerA* controllerA;
IBOutlet ViewControllerB* controllerB;
}
@end;
AppDelegate应该知道ViewControllerA
和ViewControllerB
,但视图控制器都不应该彼此了解。这样,调试和扩展应用程序就会容易得多。
答案 1 :(得分:1)
//current view controller index
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
//previous view controller (index -1)
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];
(access to anything you want)
account.property = object;
[account doSmthng];
答案 2 :(得分:0)
在每个视图控制器中,您可能希望添加实例变量/属性以跟踪其他视图控制器。
你可能有:例如:
@interface ThisViewController : UIViewController {
SomeViewController *sViewController;
// other instance variables
}
@property (nonatomic, retain) SomeViewController *sViewController;
这不仅可以更容易地从其他视图控制器调用方法并访问其公共属性,而且还允许您更轻松地在两者之间进行翻转(使用或不使用动画)。