如何在视图控制器之间传递数字/整数?

时间:2009-08-16 18:30:21

标签: iphone cocoa-touch uiviewcontroller

在编写我的iphone应用程序时遇到数字问题。我想将一个数字(可能最终是一个数组)从一个视图控制器传递给另一个视图控制器。我已设法做到这一点将字符串,但我只是无法弄清楚数字。这就是我的......

PrimaryViewController.h

     @interface PrimaryTimerViewController : UIViewController {
        IBOutlet UITextField *name;
        int *number;
}
    -(IBAction)submit;
    @end

PrimaryViewController.m

 -(void)submit{
    SecondaryTimerViewController *Second  = [SecondaryTimerViewController alloc];
    Second.name = name.text;
    Second.number = 5; //causes an error
    [self.view addSubview:Second.view];
}

SecondaryViewController.h

@interface SecondaryTimerViewController : UIViewController {
    IBOutlet UILabel *secondaryLabel;
    NSString *name;
    int *number;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic) int number;

@end

SecondaryViewController.m

- (void)viewDidLoad {
        secondaryLabel.text = name;
    int num = number; //gives a cast warning
    [super viewDidLoad];
}

如果有人能够对此有所了解,那就太棒了。我是新手,并且已经谷歌搜索了几个小时: - (

2 个答案:

答案 0 :(得分:1)

Objective-C中的标准做法是使用init方法(或重载)初始化这些内容,而不是在alloc调用后直接在对象上设置这些工具。实际上,UIViewController 需要才能在调用许多方法之前进行初始化。大多数(如果不是全部)Cocoa类(以及你实现的类)都需要在它们可以/应该被使用之前进行初始化。

您是以编程方式(在loadView中)还是在NIB中创建视图(在SecondaryViewController中)?在任何一种情况下,在SecondaryViewController.h中创建一个新的重载:

-(id)initWithName:(NSString*)name number:(int)num;

然后在您的.m文件中:

-(id)initWithName:(NSString*)name number:(int)num
{
    if (self = [super init]) // or [super initWithNib:...] if you are using a NIB.
    {
        self.name = name;
        self.number = num;
    }
    return self;
}

然后在PrimaryViewController中:

SecondaryTimerViewController *Second = [[SecondaryTimerViewController alloc] initWithName:name.text number:5];
[self.view addSubview:Second.view];

您的另一个问题是您在SecondaryViewController.h中输入的ivar不正确:

int* number;

应阅读:

int number;

答案 1 :(得分:0)

你可以使用杰森的方法,或者你可以使用单身人士。我喜欢使用单例,因为我可以随处访问它,并且它的内存效率很高。

如果您想开始使用单身人士,可以使用以下.h和.m:

#import <Foundation/Foundation.h>

@interface Board : NSObject {
    NSInteger number;
}

@property (nonatomic) NSInteger number;

+ (Board *) instance;

@end

实施:

#import "Board.h"

@implementation Board

@synthesize number;

static Board *sharedBoard = nil;

+ (Board *) instance {
    @synchronized(self) {
        if(sharedBoard == nil)
            sharedBoard = [[self alloc] init];
    }

    return sharedBoard;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if(sharedBoard == nil) {
            sharedBoard = [super allocWithZone:zone];

            return sharedBoard;
        }
    }

    return nil;
}

- (id) copyWithZone:(NSZone *)zone {
    return self;
}

- (id) retain {
    return self;
}

- (unsigned) retainCount {
    return UINT_MAX;
}

- (void) release {
    [contents release];
}

- (id) autorelease {
    return self;
}

@end

这允许您将Board.h包含到任何实现文件中,并通过以下方式访问它:

- (void) viewDidLoad {
    Board *board = [Board instance];
    board.number = 15;
}

另一种方法是将它包含在标题中,并将其设置为变量,以便在所有方法中都可用。这种方法有什么好处,你可以访问同一个实例,而不需要在你的委托中创建一个新实例。