带有自定义委托的iOS SubView

时间:2012-09-10 02:23:09

标签: iphone uiviewcontroller delegates subview

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

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

但是,我的委托方法未被调用。 subViews会导致什么?从概念上讲,我在使用自我时缺少某些东西。因为所有的VC都要发布大量的代码,我认为嵌套的子视图和委托有一个基本的想法。

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

2 个答案:

答案 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是您要访问的堆栈中的控制器数量