2014-03-13 219 views
0

我對iOS開發很陌生,我知道有這樣的問題,但我似乎無法從這些示例中抽出我認爲需要的東西。從另一個視圖更新另一個視圖的標籤內容

我試圖通過編寫一個非常簡單的抵押計算器來教給自己。我有兩種觀點,MortgageCalculatorViewController,用戶輸入貸款價值,期限和利息;以及ResultsViewController,其中重新顯示此信息,以及標籤中的每月付款。我目前的問題是我似乎無法弄清楚如何將計算出的每月支付值轉交給ResultsViewController。

我將segue showResultsSegue命名爲。

在MortgageCalculatorViewController:

#import "MortgageCalculatorViewController.h" 
#import "ResultsViewController.h" 

@interface MortgageCalculatorViewController() 

@end 

@implementation MortgageCalculatorViewController 

NSString *paymentText; 

-(IBAction)calculateMonthlyPayment 
{ 
    float rate = (self.interestRate.text.floatValue/12)/100; 
    long term = self.termInYears.text.integerValue; 
    float principle = self.loanAmount.text.floatValue; 

    float termedRate = pow((1 + rate), term); 
    float payment; 

    payment = (principle * rate * termedRate)/(termedRate - 1); 

    paymentText = [NSString stringWithFormat:@"%f", payment]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"showResultsSegue"]){ 
     ResultsViewController *controller = (ResultsViewController *)segue.destinationViewController; 
     controller.paymentLabel.text = paymentText; 
    } 
} 

@end 

而且在ResultsViewController:

@interface ResultsViewController : UIViewController 

@property (nonatomic) IBOutlet UILabel *loanAmountLabel; 
@property (nonatomic) IBOutlet UILabel *termInYearsLabel; 
@property (nonatomic) IBOutlet UILabel *interestRateLabel; 
@property (nonatomic) IBOutlet UILabel *paymentLabel; 

-(IBAction)close; 

@end 

我就引導我Passing Data between View Controllers查到的資料這一做法,但我仍然看到SEGUE無變化。

任何幫助,將不勝感激。謝謝。

回答

1
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"showResultsSegue"]){ 
     ResultsViewController *controller = (ResultsViewController *)segue.destinationViewController; 
     controller.paymentLabel.text = paymentText; 
    } 
} 

當一個SEGUE準備,認爲可能尚未加載,所以paymentLabelnil。相反,在ResultsViewController上聲明paymentText財產並將該值分配給的viewDidLoad

prepareForSegue:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"showResultsSegue"]){ 
     ResultsViewController *controller = (ResultsViewController *)segue.destinationViewController; 
     controller.paymentText = paymentText; 
    } 
} 

執行情況ResultsViewController

@interface ResultsViewController : UIViewController 

@property(copy, nonatomic) NSString *paymentText; 

@end 

@implementation ResultsViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.paymentLabel.text = self.paymentText; 
} 

@end 
+0

謝謝!那就是訣竅。 – Anthony

+0

很高興我能幫到你。如果這解決了您的問題,請考慮接受答案。謝謝 – Austin

0

這可能是因爲你的ResultsViewController尚未初始化它的視圖元素,包括paymentLabel呢。嘗試設置標籤文本,像這樣前顯式調用view

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"showResultsSegue"]){ 
     ResultsViewController *controller = (ResultsViewController *)segue.destinationViewController; 
     [controller view]; 
     controller.paymentLabel.text = paymentText; 
    } 
} 

調用view將導致視圖控制器加載它的視圖元素,從而讓你正確設置標籤的文本。

0

到目前爲止,最簡單的爲什麼不使用委託,單例或如上所述使用prepareForSegue來做到這一點,正在使用NSUserDefaults。

保存字符串:

[[NSUserDefaults standardUserDefaults] setObject:paymentText forKey:@"payment"]; 
[[NSUserDefaults standardUserDefaults]synchronize]; 

讀字符串:

NSString *readPaymentString = [[NSUserDefaults standardUserDefaults] stringForKey:@"payment"]; 

什麼,你基本上需要做的,是用保存我在一個視圖中提供的代碼和讀碼在第二視圖,簡單。

我希望它是有道理的。

相關問題