2013-12-10 2 views
0

У меня есть приложение, где я делаю некоторые вычисления, и мне нужно передать результат этого вычисления в ViewController3 и показать там результат. Теперь я использую ярлык в том же ViewController2, где у меня есть расчет. Спасибо за помощь.Сделайте некоторые вычисления на Viewcontroller, нужно показать результат другому Viewcontroller

ViewController2.h

#import <UIKit/UIKit.h> 

@interface ViewController2 : UIViewController<UITextFieldDelegate> 

@property (weak, nonatomic) IBOutlet UILabel *gasPrice; 

@property (weak, nonatomic) IBOutlet UILabel *gasCarMileage; 

@property (weak, nonatomic) IBOutlet UITextField *perGalon; 

@property (weak, nonatomic) IBOutlet UITextField *miles; 

@property(nonatomic, copy, readonly) NSString *result; 

- (IBAction)getIt:(id)sender; 

@end 

ViewController2.m

#import "ViewController2.h" 

#import "ViewController3.h" 


@interface ViewController2() 

@end 

@implementation ViewController2 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

//Start calculation 

- (IBAction)getIt:(id)sender; { 

float perGalon = ([_perGalon.text floatValue]); 

float miles = ([_miles.text floatValue]); 

float mileCost = perGalon/miles; 

[self performSegueWithIdentifier:@"viewController3" sender: nil]; 
} 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([segue.identifier isEqualToString:@"viewController3"]) { 
    ViewController3 *viewController3 = [segue destinationViewController]; 
    viewController3.result = [[NSString alloc] initWithFormat: @"Every mile you drive 
will cost you $ %f", mileCost]; 
} 
} 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
self.perGalon.delegate = self; 
self.miles.delegate = self; 
} 
- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    return [textField resignFirstResponder]; 
} 
@end 

ViewController3.h

#import <UIKit/UIKit.h> 

@interface ViewController3 : UIViewController 

@property(nonatomic, copy) NSString *result; 

@end 

ViewController3.m

#import "ViewController3.h" 
#import "ViewController2.h" 

@interface ViewController3() 

@end 

@interface ViewController2() 

@property(nonatomic, copy, readwrite) NSString *result; 

@end 

@implementation ViewController3 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
} 
- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
@end 

ответ

0

Вы можете определить свойство строки в View Controller 3, который вы будете устанавливать, когда вы нажимаете вид контроллер 3 от вида контроллера 2.

интерфейса декларация ViewController3

@interface ViewController2() 

@property(nonatomic, copy) NSString *result; 

@end 

В ViewController 2 вы реализуете эту строку последним методом getIt().

[self performSegueWithIdentifier:@"viewController3" sender: nil] 

и реализовать другой метод, называемый prepareForSegue следующим

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"viewController3"]) { 
     ViewController3 *viewController3 = [segue destinationViewController]; 
     viewController3.result = "YOUR CALCULATION RESULT HERE" 
    } 
} 

Имейте в виду, вы должны установить идентификатор для просмотра контроллера 3, перейдите на раскадровку и выбрать вид для просмотра контроллера 3 и On идентификации инспектор, указанный идентификатор раскадровки как «viewController3».

+0

Большое спасибо, попробуем. –

+0

Проблемы. Первый. В файле vC2.m при записи viewController3.result = self.result.text; Я получил сообщение: Несовместимые типы указателей, назначающие 'UIlabel *' из 'NSStreeng *' Второй. Когда я сделал [self.navigationController pushViewController: viewController3]; получил сообщение: Нет видимого @interface для 'UINavigationController' объявляет селектор 'pushViewController' Я не использую NavContriller. И жаль глупого Q, я полностью newb, где мне следует использовать результат @property (nonatomic, copy) NSString *; ? –

+0

Вы должны объявить свойство в заголовке ViewController файла .h. Поскольку вы упомянули, вы не используете NavController, используете ли вы раскадровки? – ldindu

-1

Сохраните строку в VC3. При инициализации объекта VC3 установите значение из VC2. Обновление метки в VC3 (в методе viewDidLoad)

0

Используйте протокол, В ViewController2.h

@protocol ViewController2Delegate; 

@property (strong, nonatomic) id<ViewController2Delegate> delegate; 


@protocol BexAPIClientDelegate <NSObject> 
- (void)ViewController2:(ViewController2 *)vc didCalculateCost:(CGFloat)cost; 
@end 


Then at the end of the getIt() call the delegate 
[self.delegate viewController2:self didCalculateCost:gasCostPerMile]; 

Вы должны установить ViewController3 быть делегатом ViewController2, когда вы загрузите его. Также вам необходимо настроить ViewController3 для соответствия протоколу.

Использование протокола стоит усилий, поскольку это сделает ваш код понятным и простым в управлении.

+0

Спасибо, попробуем оба ответа. –

Смежные вопросы