2010-01-08 78 views
29

在看似永无止境的努力来了解更多关于iPhone开发,我一直在与一些可通过苹果开发者网站的源代码玩耍。我正在使用的特定示例是Core Data Books,找到了here。 DetailViewController和AddViewController是以编程方式编写的,因为它们没有任何xib文件。我的问题是关于在不使用IB的情况下以编程方式向视图添加内容的问题。我想在UITableView下面放置一个UISwitch,它具有DetailView中特定书籍的详细信息。我该怎么做呢?这是我到目前为止已经试过:创建UISwitch编程

在AddViewController,我设置了UISwitch:

@interface AddViewController : DetailViewController { 
id <AddViewControllerDelegate> delegate; 
UISwitch *onoff; 

} 

@property (nonatomic, assign) id <AddViewControllerDelegate> delegate; 
@property (nonatomic, retain) IBOutlet UISwitch *onoff; 

我还设置一个IBAction为:

- (IBAction)flip:(id)sender; 

然后我合成它在AddViewController。 m文件,但没有任何反应。我只需要设置开关,使其能够控制从我设置的IBAction中执行的操作。我知道这很简单,但我无法弄清楚。所以,任何帮助将不胜感激!由于

编辑1

所以我实现的代码,因为我是针对在viewDidLoad中,像这样:

- (void)viewDidLoad { 

[super viewDidLoad];  
    UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 

而且它抛出两个警告称的“通断”隐藏局部声明实例变量。但即使有这些收入,UISwitch也会弹出来,但是当我移动它或使用它时,它看起来不像它正在工作。对于我的行动看起来像这样:

- (IBAction)flip:(id)sender { 
if (onoff.on) NSLog(@"On"); 
else NSLog(@"Off"); 
} 

当开关打开时,控制台应该阅读,而当它关闭时,控制台应该读出。对?任何时候我移动它,它只是在控制台中重复,关闭。如果它开启,或者关闭,它只会炫耀。我在做什么错了?请帮忙!由于

+0

为什么不使用IB?如果你不使用它,那么为什么这些事情被宣布为IBOutlet和IBAction? – gerry3 2010-01-08 06:41:36

+0

哇。伟大的一点。我真的很想使用IB,但正如我所提到的,我试图让这个工作在一个不使用IB的视图上。有没有简单的方法将xib文件添加到只填充可用视图并显示信息单元格的屏幕?谢谢 – Steve 2010-01-08 06:50:28

回答

29

编译器正试图帮助你。因此,您正在覆盖您的viewDidLoad;中的onoff实例变量,因此永远不会设置。在你的-flip:方法中,你引用了一个无控制器。有两种方法来解决这个问题:

(一)摆脱ONOFF的本地声明的,只是用你的实例变量

(B)铸造发件人参数-flip:作为UISwitch,和访问:

- (IBAction) flip: (id) sender { 
    UISwitch *onoff = (UISwitch *) sender; 
    NSLog(@"%@", onoff.on ? @"On" : @"Off"); 
} 
+0

谢谢!这解决了我的问题。 – Steve 2010-01-08 23:31:05

16

史蒂夫,我很抱歉,如果我误解了你的问题。你真的创建UISwitch并将其添加到视图层次?控制器的-loadView-viewDidLoad实现应该有如下代码:

// Use the ivar here 
onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 
[onoff release]; 
+0

非常感谢您的帮助。它使UISwitch显示出来,这太棒了!但是,它似乎没有完全工作,请参阅我的编辑上面的代码。谢谢 – Steve 2010-01-08 16:08:16

+0

对不起,这个愚蠢的错误。我已经修好了(参见本戈特利布的评论)。 – Costique 2010-01-08 20:26:41

+0

这是一个很好的答案,比你非常@Costique! – cvursache 2013-02-16 20:46:55