2010-06-01 71 views
0

這是一個奇怪的問題。我爲我的模態視圖創建了一個帶有nib文件的視圖控制器。在該視圖中有一個標籤,數字和文本視圖。當我從源視圖創建視圖時,我嘗試設置標籤,但它顯示標籤爲null (0x0)。有點奇怪...有什麼建議嗎?現在讓我們看一下代碼(我把這裏所有的代碼,因爲這表明超過我可以解釋一下):iPad模式視圖問題:創建視圖控制器後的模式視圖標籤爲空

模態視圖控制器 - 在IB的標籤連接到的UILabel對象:

@implementation ModalViewController 

@synthesize delegate; 
@synthesize goalLabel, goalText, goalNumber; 

// Done button clicked 
- (void)dismissView:(id)sender { 

    // Call the delegate to dismiss the modal view 
    if ([delegate respondsToSelector:@selector(didDismissModalView: newText:)]) { 

     NSNumber *tmpNum = goalNumber; 
     NSString *tmpString = [[NSString alloc] initWithString:[goalText text]]; 
     [delegate didDismissModalView:tmpNum newText:tmpString]; 

     [tmpNum release]; 
     [tmpString release]; 
    } 
} 

- (void)cancelView:(id)sender { 

    // Call the delegate to dismiss the modal view 
    if ([delegate respondsToSelector:@selector(didCancelModalView)]) 
     [delegate didCancelModalView]; 
} 

-(void) setLabelText:(NSString *)text { 
    [goalLabel setText:text]; 
} 

/* 
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     // Custom initialization 
    } 
    return self; 
} 
*/ 

-(void) viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    // bring up the keyboard.... 
    [goalText becomeFirstResponder]; 
} 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // set the current goal number to -1 so we know none was set 
    goalNumber = [NSNumber numberWithInt: -1]; 

    // Override the right button to show a Done button 
    // which is used to dismiss the modal view 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
               initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
               target:self 
               action:@selector(dismissView:)] autorelease]; 

    // and now for the cancel button 
    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] 
               initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
               target:self 
               action:@selector(cancelView:)] autorelease]; 

    self.navigationItem.title = @"Add/Update Goals"; 
} 



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return YES; 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 


- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 


@end 

而且這裏是視圖控制器被創建,設置的變量,並顯示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // put a checkmark.... 
    UITableViewCell *tmpCell = [tableView cellForRowAtIndexPath:indexPath]; 
    [tmpCell setAccessoryType:UITableViewCellAccessoryCheckmark]; 

    // this is where the popup is gonna popup! 
    // ===> HEre We Go! 

    // Create the modal view controller 
    ModalViewController *mdvc = [[ModalViewController alloc] initWithNibName:@"ModalDetailView" bundle:nil]; 

    // We are the delegate responsible for dismissing the modal view 
    [mdvc setDelegate:self]; 

    // Create a Navigation controller 
    UINavigationController *navController = [[UINavigationController alloc] 
              initWithRootViewController:mdvc]; 

    // set the modal view type 
    navController.modalPresentationStyle = UIModalPresentationFormSheet; 

    // set the label for all of the goals.... 
    if (indexPath.section == 0 && indexPath.row == 0) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 1:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:1]]; 
    } 

    if (indexPath.section == 0 && indexPath.row == 1) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 2:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:2]]; 
    } 

    if (indexPath.section == 0 && indexPath.row == 2) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 3:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:3]]; 
    } 

    if (indexPath.section == 0 && indexPath.row == 3) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Long Term Goal 4:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:4]]; 
    } 


    if (indexPath.section == 1 && indexPath.row == 0) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 1:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:5]]; 
    } 

    if (indexPath.section == 1 && indexPath.row == 1) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 2:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:6]]; 
    } 

    if (indexPath.section == 1 && indexPath.row == 2) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 3:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:7]]; 
    } 

    if (indexPath.section == 1 && indexPath.row == 3) { 
     [mdvc setLabelText:[[[NSString alloc] initWithString:@"Short Term Goal 4:"] autorelease]]; 
     [mdvc setGoalNumber:[NSNumber numberWithInt:8]]; 
    } 

    // show the navigation controller modally 
    [self presentModalViewController:navController animated:YES]; 

    // Clean up resources 
    [navController release]; 
    [mdvc release]; 

    // ==> Ah... we are done... 
} 

回答

1

答案是盯着我的臉!

這裏是我做過什麼:

增加了新的功能,以委託

@protocol ModalViewControllerDelegate <NSObject> 
@required 
    - (void)didDismissModalView:(NSNumber *)goalNbr newText:(NSString *)textToSave; 
    - (void)didCancelModalView; 
    - (void)willShow:(id)theView; 
@end 

viewWillAppear功能,我增加了以下內容:

if ([delegate respondsToSelector:@selector(willShow:)]) 
    [delegate willShow:self]; 

這使得完全訪問即將顯示的模態視圖,因此我們可以在活動模態視圖內更改標籤,文本框和變量。

- (void)willShow:(ModalViewController *)theView { 

    [theView.goalLabel setText:labelText]; 
    [theView setGoalNumber:goalNumber]; 
    [theView.goalText setText:goalText]; 
} 
1

爲了完整性,在這個情況下任何人絆(它幫助我)......

模態視圖控制器的接口需要定義一個變量來保存委託:

@protocol ReminderPhotoViewDelegate <NSObject> 
@required 
- (void)willShow:(id)theView; 
@end 
@interface ReminderPhotoViewController : UIViewController { 
    id<ReminderPhotoViewDelegate> delegate; 
    UIImageView *reminderImage; 
    UILabel *reminderLabel; 
} 
@property (assign) id<ReminderPhotoViewDelegate> delegate; 
@property (nonatomic, retain) IBOutlet UIImageView *reminderImage; 
@property (nonatomic, retain) IBOutlet UILabel *reminderLabel; 
@end 

在模態控制器的實施,一定要綜合這些屬性:

@implementation ReminderPhotoViewController 
@synthesize reminderImage, reminderLabel; 
@synthesize delegate; 

無論你的「呼叫」控制器必須宣佈此協議在其自己的實現支持:

#import "ReminderPhotoViewController.h" 
@interface ReminderViewController : UIViewController <ReminderPhotoViewDelegate> { 
} 

最後,當你創建你的模態控制器的情況下,你需要設置調用的類是其委託:

ReminderPhotoViewController *photo = [[ReminderPhotoViewController alloc] init]; 
[photo setDelegate:self]; 

這是一個更完整的聲明和代碼 - 這正是答案節目,只要有更多的配套代碼。

然後,如上面所指出的,您的呼叫控制器將來自協議的方法,包括:

- (void)willShow:(ReminderPhotoViewController *)theView { 
    theView.reminderImage.image = selectedImage; 
    theView.reminderLabel.text = selectedText; 
} 
相關問題