2009-04-28 33 views
14

Hi Tôi đã có đoạn mã sau vào một ViewController.h:Objective-c Iphone làm thế nào để thiết lập giá trị mặc định cho một tài sản

#import <UIKit/UIKit.h> 

@interface CalcViewController : UIViewController { 
    NSNumber* result; 
    NSString* input; 
    //NSString* input = @""; 

    IBOutlet UITextField* display; 
} 

@property (retain) NSNumber* result; 
@property (retain) NSString* input; 
@property (nonatomic, retain) UITextField* display; 

@end 

Vấn đề là tôi muốn nối thêm một chuỗi đầu vào nhưng điều này là không thể khi nó vẫn còn null. Đó là lý do tại sao tôi muốn đặt giá trị mặc định của đầu vào là @ "". Nhưng tôi phải đặt mã này ở đâu.

Tôi biết một giải pháp khả thi mà bạn đặt nó trong một hàm tạo mặc định. Nhưng tôi không có ý tưởng trong những tập tin để đặt này. Và tôi nên gọi nó từ đâu.

Tôi tiếc là chỉ có một sự hiểu biết hạn chế về C và nhận ra rằng có lẽ tệp .h không phải là địa điểm phù hợp.

Loại dự án là Ứng dụng dựa trên chế độ xem nếu bạn cần điều này.

Hy vọng bạn có thể trợ giúp.

Trả lời

16

Bạn có thể thấy hữu ích khi đọc một số tài liệu về Objective-C hoặc Cocoa. Bạn có thể tìm thấy một số gợi ý hay về đọc tài liệu nếu bạn thực hiện tìm kiếm ở đây trong StackOverflow hoặc trên Google.

Để trả lời câu hỏi của bạn, bạn cần có @implementation của CalcViewController. Một thường sẽ đặt @implementation này bên trong tệp * .m. Nếu tệp * .h của bạn được đặt tên là "ViewController.h" thì việc triển khai sẽ xuất hiện trong "ViewController.m".

Sau đó bạn sẽ tạo bản sao của hàm khởi tạo UIViewController và đặt nó ở đó (Tôi không biết hàm init mặc định là gì).

Ví dụ:

@implementation CalcViewController 

@synthesize result; 
@synthesize input; 

- (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle 
{ 
    self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init 
    if (self) { 
     input = [[NSString alloc] initWithString:@""]; // You should create a new string as you'll want to release this in your dealloc 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [input release]; 
    [super dealloc]; 
} 
@end // end of the @implementation of CalcViewController 

GHI CHÚ:

  • Bạn có thể muốn đổi tên các tập tin để CalcViewController. Tôi tin rằng nó dễ dàng hơn cho công cụ tái cấu trúc của Xcode để giải quyết.
  • Bạn không cần khai báo @property cho biến cá thể hiển thị khi bạn kết nối với Trình tạo giao diện. Trừ khi bạn muốn khách hàng của CalcViewController để thay đổi nó thường

EDIT: 28 Tháng 4 năm 2009: 10:20 EST: Tôi đề nghị thực sự phân bổ một NSString như bạn về mặt kỹ thuật nên thả nó trong dealloc.

EDIT: ngày 28 tháng 4 năm 2009: 11:11 SA EST: Tôi đã cập nhật @implementation để sử dụng phiên bản init của UIViewController.

+0

trả lời cần lưu ý của một tập tin CalcViewController tôi chỉ gặp một ViewController của nó . Và có màn hình cần phải thay đổi thường xuyên. Cảm ơn – MrHus

+0

Chỉ cần được rõ ràng, khi tôi đã viết về biến thể hiện hiển thị thay đổi thường xuyên, tôi có nghĩa là * instance * thực tế của biến. Không phải là dữ liệu thực tế trong đối tượng hiển thị. Vì vậy, nếu bạn có thể tưởng tượng rằng bạn sẽ phá hủy và tạo lại biến cá thể hiển thị, thì điều này sẽ có ý nghĩa. –

+0

Ok Tôi sẽ tìm cách thay đổi hiển thị mà không có biến. Nhưng - (id) init không được gọi. Có lý do gì không? – MrHus

3

Một tùy chọn khác là viết trình lấy của riêng bạn cho thuộc tính đầu vào của bạn và trả lại @ "" nếu biến mẫu là không. Điều này sẽ làm việc ngay cả khi bạn vô tình hoặc cố ý gán nil để đầu vào, trong khi sử dụng init để thiết lập một giá trị mặc định sẽ phá vỡ.

+0

Một giải pháp tốt, nhưng không phổ biến. Các độc giả khác của mã của bạn có thể sẽ tìm đến trình khởi tạo được chỉ định cho giá trị mặc định. –

+1

Tôi sẽ không nói rằng, trả về một đối tượng trống thay vì nil là khá phổ biến trong suốt Cocoa. Đó không phải là để nói rằng thiết lập nó trong init là xấu hay bất cứ điều gì, nó là một vấn đề ưu tiên hơn. –

9

Câu hỏi rất hay. Câu trả lời ngắn gọn là bắt đầu các giá trị trong hàm init. Bạn cần ghi đè hàm init mặc định để giá trị mặc định sẵn sàng trước khi đối tượng có thể được sử dụng. Tôi muốn đề nghị mọi người dừng đề nghị người khác đọc tài liệu; hãy trả lời câu hỏi trực tiếp nếu bạn có thể.

+4

Những người nói "blah blah blah có lẽ bạn nên đọc các tài liệu" nên được spanked, ostracized, và ghét khi. họ câm. –

+0

Up-bỏ phiếu alex gay trên SO vì tôi đồng ý với tình cảm này rất nhiều. –

+4

Ý tôi là, màu xám alex –

0

Cách rõ ràng nhất để thực hiện nó sẽ như sau:

  1. Trong file viewcontroller.m của bạn, ghi đè lên các phương pháp init mặc định. Phương pháp này được gọi là mọi lúc một bộ điều khiển chế độ xem được khởi tạo. Vì vậy, đó là cách tốt nhất để khởi tạo biến của bạn.

    - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle { 
        self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's  version of init 
        if (self) { 
         varName = [[NSString alloc] initWithString:@""]; 
        } 
        return self; 
    } 
    
  2. Bây giờ, bất cứ nơi nào trong mã của bạn, bạn muốn nối thêm một chuỗi để chuỗi ban đầu của bạn, chỉ cần sử dụng: varName = [NSString stringwithformat:@"%@%@", varName, newString];

Các vấn đề liên quan