2009-09-28 67 views
1

功能我是一个初学者programmmer,这是对的Xcode - iPhone。虽然我做了很多我的iPhone应用程序,但我似乎缺乏对简单通信如何工作的一些理解。调用从另一个UIViewController中

特别是当我有2个ViewControllers。

而我从另一个ViewController调用ViewController的一个函数。两者都在tabbarController下。我想实现的是当我在ViewA我,攻上TableCell的之后,我应该调用ViewB的方法和ViewB的导航栏推向viewDetail。

以下是我使用 的代码ViewControllerA.h(其中我打电话的方法)

@class ViewControllerB; 
@interface SmartDDxViewController : UIViewController { 

    IBOutlet UITableView *tableView; 
    ViewControllerB *xViewController; 


} 
@property (nonatomic, retain) UITableView *tableView; 
@property (nonatomic, retain) ViewControllerB *xViewController; 

这是我用来调用它.. ViewControllerA。米

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中选择该视图时,它没有被推送。

回答

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,但无论是视图控制器应该了解对方。这样,调试和扩展您的应用将变得更加容易。

+0

你的解决方案使应用整洁,但毫无疑问,但我认为我有两个理由,ViewAController属于TabItem1和FROM此控制器,我想要去tabItem2显示ViewBController被推到另一个DetailView 。 我不知道如何推动通过的appDelegate会的工作,那么,它不是我的解决方案工作太..反正 – user134611 2009-09-28 14:02:23

+0

你AppDelegates知道它所有的标签,所以它(如果有的话)应该知道如何推新控制器。 '[[self.tabBarController.viewControllers objectAtIndex:1] pushViewController:newController动画:YES];'或一些其他类似的简单应该做的伎俩。 – PeyloW 2009-09-28 14:47:03

+0

兄弟,我实现了像你说的,我有一些东西迷惑, 我应该在的appDelegate的新方法?应该PushViewController 1和显示TAB1,而这一切我从anotherViewcontrollerB做,大概会喜欢 [的appdelegate NewMethodinAppDel:SD:]。 这样的事? – user134611 2009-10-06 18:36:05

0

在每个视图控制器中,您可能需要添加实例变量/属性以跟踪其他视图控制器。

你可能有,例如:

@interface ThisViewController : UIViewController { 
    SomeViewController  *sViewController; 
// other instance variables 
} 
@property (nonatomic, retain) SomeViewController  *sViewController; 

这不仅可以更容易地调用与其他视图控制器的方法和访问其公共属性,但它也可以让你在两者之间翻转更简单的方法(有或没有动画)。

+0

感谢您的回复朋友..我想通了,但得到了一个新的问题..可以雅请再读一遍这个问题!,myBad! – user134611 2009-09-28 11:49:09

+0

到视图控制器直访问的大部分时间一个坏主意。这是一个循环引用的错误设计,可能会导致内存泄漏。 – PeyloW 2009-09-28 13:31:23

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];