2016-02-01 5 views
1

Я хочу отредактировать UILabel, который находится в ViewContrller2 из ViewController1.Редактировать UILabel из другого класса (другой ViewController)

Это мой код, но он не работает:

ViewController1.m:

// .... 

// In my viewDidLoad : 

ViewController2 *vc = [[ViewController2 alloc]init]; 

// calling a function : 

[vc updateLabel]; 

// .... 

ViewController2.m:

// .... 

-(void)updateLabel{ 

    self.MyLabel.text = @"Text"; 

    // MyLabel is already declared in ViewController2.h 

} 

// .... 

Пожалуйста, вы можете мне помочь?

Я пробовал много кодов, но он все еще не работает, и я не знаю, где проблема.

+0

Guess: Вы создаете новый объект класса 'ViewController2' – Larme

+0

Вы добавляете вид ВХ в любом месте, как подвид? – uchiha

ответ

1

Правильно или неправильно, для этого я, вероятно, использовал NSUserDefaults, чтобы вытащить информацию между контроллерами View.

ViewController1

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
[standardDefaults setObject:@"This is my Label" forKey:@"labelKey"]; 

ViewController2

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
MyLabel.text = [standardDefaults stringForKey:@"labelKey"] 

Ответ обновлен с учетом исправленный вопрос для UIProgressView согласно ниже комментарий:

View Controller1.м

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
[standardDefaults setDouble:0.75 forKey:@"ProgressValue"]; //value you want your progress view to show 

ViewController2.h

... создать выход для вашего зрения прогресса здесь и связать его в IB

@property (weak, nonatomic) IBOutlet UIProgressView *ProgressView; 

ViewController2.m

@synthesize ProgressView; 

...

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
double ProgressValue = [standardDefaults doubleForKey:@"ProgressValue"]; 
ProgressView.progress = ProgressValue; 
+0

проблема в том, что эта ситуация является всего лишь примером. На самом деле мне нужно, чтобы управлять uiprogressview с другого VC. – ramsserio

+0

. Это другой вопрос, но мой подход все еще действителен. Используйте NSUserDefaults для передачи значения между контроллерами и оставьте свой прогресс с контроллером, к которому он принадлежит, но используйте значение NSUserDefaults для его обновления. Таким образом, значение, измененное в одном контроллере, может быть передано вашему прогрессу, находящемуся на другом контроллере. –

+0

Я исправил свой ответ. Пожалуйста, отметьте как ответ, если он ответил на ваш вопрос. С наилучшими пожеланиями. –

0

Вы создаете новую версию vc2, вам нужно получить доступ к той, которая уже существует. Попробуйте обмен ссылки на контроллер VC2 в VC1 вместо

Вы также должны думать о том, следует ли обновлять его непосредственно из VC1 - вы можете обновить ярлык на viewDidLoad в VC2 вместо

Есть несколько вариантов в зависимости от того, как вы создали vc1 & VC2, и есть хорошее описание плюсов и минусов здесь http://matteomanferdini.com/how-ios-view-controllers-communicate-with-each-other/

+0

Благодарим за быстрый ответ! Но как я могу поделиться ссылкой уже существующего объекта? – ramsserio

+0

Я обновил ответ, чтобы включить ссылку, которая объясняет параметры красиво. – Russell

0

вы создаете новый объект класса ViewController2, если вы хотите, чтобы установить это значение для всех видов, которые вы можете использование: - 1-NSUserDefaults 2-SQLite-Core Data взгляд на то, как передавать данные между контроллерами зрения: - Passing Data between View Controllers

0

Убедитесь, что перед вызовом updateLabel на ViewController2viewDidLoad метод ViewController2 называется иначе self.MyLabel будет ноль, и, следовательно, все, что вы назначить self.MyLabel.text будет быть бесполезным. Теперь, чтобы получить вызов viewDidLoad из ViewController2, вам необходимо получить доступ к свойству вида ViewController2, так как viewDidLoad контроллера вида вызывается при первом доступе к представлению контроллера.

viewDidLoad То, что вы намереваетесь сделать, будет работать точно. Чтобы убедиться, что это действительно проблема, сохраните точку останова в методе -(void)updateLabel и проанализируйте ее, чтобы узнать, является ли self.MyLabel нулем или нет.

+0

Я попытался вызвать '[vc viewDidLoad];' перед вызовом 'updateLabel', но он все еще не работает – ramsserio

+0

, вы не должны явно вызывать' viewDidLoad'. Попробуйте обратиться к 'vc.view'. На данный момент jus печатает кадр vc.view, а затем вызывает 'updateLabel' – uchiha

+0

Также вы пытались сохранить точку останова? Сидит ли шоу 'self.MyLabel' как ноль? – uchiha

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