如何动态设置UIView的子视图(iPhone)?

时间:2009-07-22 00:13:19

标签: iphone uiview uiviewcontroller

我肯定会在这里做一些完全愚蠢的事情,希望有人可以告诉我什么!总之,我想在编辑按钮(我将使用分段按钮)时以编程方式切换子视图。它不需要动画。理想情况下,我会从笔尖加载这些视图的内容。

我正在推动一个UIViewController子类,从一个nib初始化到一个navigationController。这个视图控制器&它的“默认”视图显示确定。这个笔尖包含:

File's Owner [Class=my view controller subclass]
First Responder
View
--Bar Segmented Control
--View //this is the 'subview' whose content I want to toggle

也许我的IB网点出了问题?它们如下所示:

switchableView <--> View
view <--> View

宣布switchableView的地方:

IBOutlet UIView *switchableView;
...
@property (nonatomic, retain)   UIView *switchableView;

我被困在更换这个UIView的内容了。首先,我只想在视图生效时将其设置为默认值。一旦我得到它,将其交换到其他东西应该很容易,因为我已经可以捕获由分段按钮生成的事件。有人可以告诉我我做错了吗?

- (void)loadView {
NSLog(@"loadView invoked");
[super loadView];
UIView *view = [[UIView alloc] init];
UILabel *label = [[UILabel alloc] init];
label.text = @"Segment1";
[view addSubview:label];
[switchableView addSubview:view]; //this is what I can't work out
[view release];
[label release];    
}

该方法被调用(就像viewDidLoad),但都没有帮助。我猜我错了[switchableView addSubview:view]。我也试过switchableView = view,但是在Java和Perl的安全性方面很长一段时间让我不能100%确定这是否适合尝试!

希望有人可以帮我。提前谢谢,

4 个答案:

答案 0 :(得分:3)

在检查UICatalog示例代码后最终解决了这个问题(感谢你们两位给我一些指示)。以下作品:

- (void)loadView {
    [super loadView];

    //define what will go in the seg1 view
    UILabel *mylabel = [[UILabel alloc] initWithFrame:switchableView.frame];
    mylabel.text=@"finally";
    self.seg1view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease];
    [self.seg1view addSubview:mylabel];
    [mylabel release];

    //define what will go in the seg2 view
    UILabel *mylabel2 = [[UILabel alloc] initWithFrame:switchableView.frame];
    mylabel2.text=@"it works!";
    self.seg2view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease];
    [self.seg2view addSubview:mylabel2];
    [mylabel2 release]; 

    //default the switchable view to seg1view
    [switchableView addSubview:self.seg1view];
}

-(void)doTheSwitch {
    if (segmentedButton.selectedSegmentIndex == 0) {
        [seg2view removeFromSuperview];
        [switchableView addSubview:seg1view];
    }
    if (segmentedButton.selectedSegmentIndex == 1) {    
        [seg1view removeFromSuperview];
        [switchableView addSubview:seg2view];
    }   
}

其中以下内容也定义为属性(保留,非原子)

IBOutlet UIView *switchableView;
UIView  *seg1view;
UIView  *seg2view;

答案 1 :(得分:0)

以下是一些可以帮助您的代码段。第一个是导航控制器的初始化

// In AppDelegate.m
-(void)applicationDidFinishLaunching:(UIApplication *)application
{
  // Create and configure the main view controller.
  UIViewController *firstViewController = [[UIViewController alloc] init];

  // Add create and configure the navigation controller.
  UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
  self.navController = navigationController;
  [navigationController release];

  // Configure and display the window.
  [window addSubview:navController.view];
  [window makeKeyAndVisible];
}

然后,当你准备好一个新视图时,只需按一下即可。

// Wherever you need to get your new view on there
UIViewController *secondViewController = [[UIViewController alloc] init];
[[self navigationController] pushViewController:secondViewController animated:YES];
[secondViewController release];

你应该每天经历大约5个Apple Sample Projects,以便真正熟练掌握iPhone世界。看看这个开头的人:TableSearch

答案 2 :(得分:0)

最可能的问题是您没有在视图上设置框架,这意味着在成功附加框架时,它们的大小为0x0。

尝试类似:

- (void)loadView {
  NSLog(@"loadView invoked");
  [super loadView];

  CGRect labelFrame = CGRectZero;
  labelFrame.size.height = switchableView.size.height;
  labelFrame.size.width = switchableView.size.width;

  UILabel *label = [[UILabel alloc] initWithFrame:labelFrame];
  label.text = @"Segment1";
  [switchableView addSubview:label]; //this is what I can't work out
  [label release];    
}

同样删除了视图,因为它是无偿的(UILabel是一个UIView,你正在堆叠三个视图,其中2个只有一个子视图覆盖其全帧。)它省略了UIViewController视图属性(通常它使用与实例变量或属性同名的局部变量是不好的,有编译器警告你可以打开以避免这种情况。)

答案 3 :(得分:0)

如果我理解你的问题,你试图将一个视图与另一个视图交换。实现此目的的一种方法如下:

将UIView添加到名为switchView的根视图中。在代码或Interface Builder中创建一个名为subView1的新UIView,并在根视图加载时将其添加为switchView的子类:

[switchView addSubview:subView1];

当用户在根视图中切换分段控件时,以类似于subView2的方式创建一个新的UIView,并使用switchView的当前子视图切换它:

[subView1 removeFromSuperview];
[switchView addSubview:subView2];