2010-07-30 79 views
0

好的,这将是一个愚蠢的问题,但无论如何,我无处可以问它,除了这里。Objective-C,iPhone SDK基础知识

我有两个按钮,并且必须有一个切换大小写语句执行它们中的任何一个。 当然,我可以把这个语句放在每个IBAction代码块中,但是这个代码看起来非常糟糕。

我试图把开关等情况到一个单独的方法,这就是我:

.h文件中

#import <UIKit/UIKit.h> 

@interface AppViewController : UIViewController 
{ 
    IBOutlet UILabel *someTextLabel; 
    NSNumber *current; 
} 

@property (nonatomic, retain) IBOutlet UILabel *someTextLabel; 
@property (nonatomic, retain) NSNumber *current; 

- (void) switchMethod; 
- (IBAction) pressButtonForward; 
- (IBAction) pressButtonBack; 

@end 

.m文件

#import "AppViewController.h" 

@implementation AppViewController 

@synthesize someTextLabel; 
@synthesize current; 

current = 0; 

- (void) switchMethod:current 
{ 
    switch((int)current) { 

     case 0: 
     //do something 
     break; 

     case 1 : 
     //do something 
     break; 

     //etc 

     default: 
     //do something 
     break; 
    } 
} 

- (IBAction) pressButtonBack 
{ 
    if((int)current == 0) { 
     current = 6; 
    } 
    else { 
     current--; 
    } 
    //here must be a switchMethod performed 
} 

- (IBAction) pressButtonForward 
{ 
    if((int)current == 6) { 
     current = 0; 
    } 
    else { 
     current++; 
    } 
    //here must be a switchMethod performed 
} 

//auto-generated code here 

@end 

当然这个代码是不正确的,但这就像我想要得到的蓝图。

问题:

  1. 什么是使用这种开关case语句作为一个单独的方法,这样我可以从IBAction为方法调用它的正确方法是什么?
  2. 我该如何为此代码投入数据类型才能工作,还是最好在整个地方使用整数类型(对于“当前”变量)?
+0

请编辑您的问题,包括实际问题。 – 2010-07-30 10:58:48

+0

你的问题是什么? – taskinoor 2010-07-30 11:04:16

回答

2

我还没有真正得到了你的问题,但也许你应该向前和向后的情况下使用之间这样的方法进行切换:

- (IBAction)pressButton:(id) sender; 

,并根据发件人的价值,你也许可以切换的情况下前进和后退之间。因此,您的代码可能会更具可读性,您不必复制交换机。

注: :如果你唯一的问题是你的交换机重复,如果你不想使用我的方法,我不明白你为什么不直接调用你的switchMethod在两个函数中...

+0

您可以通过比较按钮的标签值(您可以在IB中分配)来查看哪个按钮被点击: UIButton * button =(UIButton *)sender; if(button.tag == 0){ ... – 2010-07-30 11:54:45

+0

是的,我的问题是交换机的重复。我只是不知道如何正确调用switchMethod。我试过[self.switchMethod:(int)current],但是会导致“Void值不被忽略,因为它可能是错误的”。 – ufw 2010-07-30 12:06:17

+0

我最近没有太多的使用Objective-C,但我会使用下面的语法:[self switchMethod:[current intValue]](使用空格而不是点!我们不在python中) – ThR37 2010-07-30 12:11:27

0

回答问题1:

只是发送消息给自己调用切换方法。

回答问题2:

的NSNumber是一个封装的数字值的对象。为了一个NSNumber转换为int:

int myIntValue = [number intValue]; 

为int转换为NSNumber的

NSNumber* number = [NSNumber numberWithInt: myIntValue]; 

然而,在你的榜样,这是更好地只定义当前为int。所以,你的代码应该是这个样子:

@interface AppViewController : UIViewController 
{ 
    IBOutlet UILabel *someTextLabel; 
    unsigned int current; 
} 

@property (nonatomic, retain) IBOutlet UILabel *someTextLabel; 
@property (nonatomic, assign) unsigned int current; // nonatomic might be redundant for POD types 

- (void) switchMethod; 
- (IBAction) pressButtonForward; 
- (IBAction) pressButtonBack; 

@end 

@implementation AppViewController 

@synthesize someTextLabel; 
@synthesize current; 

//current = 0; this wouldn't compile, in any case it is redundant, ivars start out as 0. 

- (void) switchMethod 
{ 
    switch(current) 
    { 
     // do switchy stuff 
    } 
} 

- (IBAction) pressButtonBack 
{ 
    if(current == 0) 
    { 
     current = 6; 
    } 
    else 
    { 
     current--; 
    } 
    [self switchMethod]; 
} 

- (IBAction) pressButtonForward 
{ 
    if(current == 6) 
    { 
     current = 0; 
    } 
    else 
    { 
     current++; 
    } 
    [self switchMethod]; 
} 

// etc 

@end 

NB虽然我定义的属性当前,我还没有在代码中使用它,这是一个有点禁忌。主要问题是,如果有人决定使用KVO观察电流,他们将不会被通知这些变化。我真的应该有书面的东西像

switch([self current])... 

[self setCurrent: 6]...