-1

我有三个 viewController,一个 tableViewController 在触摸单元格时添加一个 subView,我们称之为 userSubView,即 viewController 2。点击 VC2 上的一个按钮会添加另一个 subView,我们称之为 actionSubView,即 VC3。

我需要对 VC3 执行操作以在 VC1 上调用所需的委托协议方法。VC1 在头文件中导入自定义委托,Xcode 在 VC1 上正确填充所需的方法。在 VC1 中实例化 VC3 后,我还在 VC1 中将委托设置为 self。

但是,我的委托方法没有被调用。subViews 会导致这种情况怎么办?在使用 self. 由于所有 VC 的原因,要发布大量代码,而且我认为嵌套子视图和委托缺少一个基本想法。

谢谢,非常感谢任何帮助。

4

2 回答 2

0

多个对象(视图对象或视图控制器对象)之间的消息传递本质上是相同的方式。

在上面的问题陈述中,我找不到任何理由采用三个 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

在第二视图的最后一个委托方法实现中提到了从第三视图调用所需的第一视图委托方法的最简单方法。

[self.objThirdView setCaller:objFirstView];

流程如下:

Main ViewController (MainVC) 添加 FirstView 的子视图 -> FirstView 加载一个 TableView -> 当一个 TableCell 被选中时 -> 在 MainVC 中调用 Delegate 方法。这需要将第二个视图添加为子视图。SecondView 显示一个按钮 -> 按钮被点击(调用 MainVC 中的委托方法以添加第三个视图的子视图。现在 ThirdView 显示一个段控件 -> 段控件值已更改 -> 根据选定的过滤器和所需的委托方法之一重新加载 FirstView 表在 MainVC 中调用 FirstView。

我知道答案是不言自明的(虽然有点冗长:-))但是如果您仍然有任何问题,您可以从这里检查源代码并从中获取参考。

于 2012-09-11T05:32:58.320 回答
0

尝试

(UIViewController*)[self.navigationController.viewControllers objectAtIndex:1]).callMethod

其中 1 是您要访问的堆栈中的控制器数量

于 2012-09-25T22:20:15.857 回答