我肯定会在这里做一些完全愚蠢的事情,希望有人可以告诉我什么!总之,我想在编辑按钮(我将使用分段按钮)时以编程方式切换子视图。它不需要动画。理想情况下,我会从笔尖加载这些视图的内容。
我正在推动一个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%确定这是否适合尝试!
希望有人可以帮我。提前谢谢,
保
答案 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];