我有三个viewControllers,一个tableViewController,在触摸一个单元格时添加一个subView,让我们称之为userSubView,它是viewController 2.点击VC2上的一个按钮添加另一个subView让我们调用actionSubView,即VC3。
我需要在VC3上执行操作以在VC1上调用所需的委托协议方法。 VC1在头文件中导入自定义委托,Xcode正确填充VC1上所需的方法。在VC1中实例化VC3之后,我还在VC1中将委托设置为self。
但是,我的委托方法未被调用。 subViews会导致什么?从概念上讲,我在使用自我时缺少某些东西。因为所有的VC都要发布大量的代码,我认为嵌套的子视图和委托有一个基本的想法。
谢谢,任何帮助都非常感谢。
答案 0 :(得分:0)
在多个对象(View对象或View Controller对象)之间传递消息的方式基本相同。
在上面的问题陈述中,我发现没有理由只使用三个UIViewController子类来使用它们的视图作为父视图上的子视图添加。通过使用UIView子类也可以解决相同的目的。
我使用了三个UIView子类,所有这些子类都需要在调用类中实现委托方法。主视图控制器将具有类似
的声明#import "FirstView.h"
#import "SecondView.h"
#import "ThirdView.h"
@interface ViewController : UIViewController <ItemPickerDelegate , AllowLoadDelegate>
{
FirstView* objFirstView;
SecondView* objSecondView;
ThirdView* objThirdView;
}
@property (nonatomic , retain) FirstView* objFirstView;
@property (nonatomic , retain) SecondView* objSecondView;
@property (nonatomic , retain) ThirdView* objThirdView;
@end
现在,相同View Controller子类的实现看起来像
@implementation ViewController
@synthesize objFirstView;
@synthesize objSecondView;
@synthesize objThirdView;
-(void)dealloc {
[objFirstView release];
[objSecondView release];
[objThirdView release];
[super dealloc];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self loadInitialView];
}
-(void)loadInitialView {
if (!objFirstView) {
self.objFirstView = [FirstView initWithNibName:@"FirstView" bundle:nil];
}
[self.objFirstView setCaller:self];
[self.objFirstView setCurrentContentMode:TableContentModeAll];
[self.view addSubview:objFirstView];
[objFirstView setFrame:CGRectMake(0, 0, 320, 220)];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
#pragma mark -Delegate From First View
- (void)didSelectTableView:(UITableView*)tableView atIndexPath:(NSIndexPath*)indexPath {
if (objSecondView) {
[objSecondView removeFromSuperview];
}
else if (!objSecondView) {
self.objSecondView = [SecondView initWithNibName:@"SecondView" bundle:nil];
}
[self.objSecondView setCaller:self];
[self.view addSubview:objSecondView];
[objSecondView setFrame:CGRectMake(0, 220, 320,60)];
}
- (void)didApplyFilter:(TableContentMode)filter {
NSLog(@"%d filter Loaded",filter);
}
#pragma mark -Delegate From Second View
- (void)didAllowLoadFilters:(BOOL)allow {
if (objThirdView) {
[objThirdView removeFromSuperview];
}
else if (!objThirdView) {
self.objThirdView = [ThirdView initWithNibName:@"ThirdView" bundle:nil];
}
[self.objThirdView setCaller:objFirstView];
[self.view addSubview:objThirdView];
[objThirdView setFrame:CGRectMake(0, 280, 320,30)];
}
@end
在Second View的最后一个委托方法实现中提到了从第三个视图调用First View所需委托方法的最简单方法。
[self.objThirdView setCaller:objFirstView];
流程如下:
主ViewController(MainVC)添加了FirstView的子视图 - &gt; FirstView加载一个TableView - &gt;当选择TableCell时 - &gt;在MainVC中调用Delegate方法。这需要将第二个视图添加为子视图。 SecondView显示一个按钮 - &gt;点击按钮(调用MainVC中的委托方法以添加第三视图的子视图。现在,ThirdView显示一个Segment控件 - &gt;更改了段控件值 - &gt;根据选定的Filter重新加载FirstView表,并调用FirstView的一个必需的委托方法在MainVC。
我知道答案是一个自我解释(有点冗长:-))但如果你仍有任何问题,你可以查看here的源代码并参考。
答案 1 :(得分:0)
尝试
(UIViewController*)[self.navigationController.viewControllers objectAtIndex:1]).callMethod
其中1是您要访问的堆栈中的控制器数量