从另一个UIViewController调用一个函数

时间:2009-09-28 10:47:50

标签: iphone objective-c cocoa-touch uikit

我是初学者程序员,这适用于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时,它没有被推动。

3 个答案:

答案 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应该知道ViewControllerAViewControllerB,但视图控制器都不应该彼此了解。这样,调试和扩展应用程序就会容易得多。

答案 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;

这不仅可以更容易地从其他视图控制器调用方法并访问其公共属性,而且还允许您更轻松地在两者之间进行翻转(使用或不使用动画)。