2014-01-10 3 views
2

Я абсолютный новичок (начал учиться программировать две недели назад), поэтому заранее извиняюсь за самый простой вопрос. У меня возникли проблемы с передачей информации от одного метода другому.Передача информации между методами в Objective-C

Фон: У меня есть множество фраз. Я хочу получить случайную фразу из массива, отобразить ее в пользовательском интерфейсе, а также сделать эту же фразу доступной в Share Sheet. Я могу правильно получить и отобразить случайную фразу в пользовательском интерфейсе при нажатии кнопки (вызов моего метода «randomPhrase» из другого класса). Это прекрасно работает.

Проблема: Я не могу передать фразу "currentPhrase" методу Share Sheet. Как сделать этот currentPhrase доступным для использования внешним методом. Я использую ARC.

// Call the randomPhrase method and keep the output as a string called currentPhrase (this line works) 
- (IBAction)phraseButtonTapped { 
NSString *currentPhrase = [self.otherFile randomPhrase]; 


// Display the currentPhrase string in the UIlabel (this line works) 
self.phraseLabel.text = currentPhrase; 


// Output to log for checking (this line works) 
NSLog(@"current content is %@", currentPhrase);   
} 


// Now for the Share Sheet. I could do this below, but text doesn’t match the UI phrase. 
// NSString *shareText = [self.otherFile randomPhrase]; 
// NSArray *itemsToShare = @[shareText]; 


// So, here I’m trying to populate the current phrase into the share sheet. (this doesn’t work). 
- (IBAction)showActivityView:(id)sender {  
NSArray *itemsToShare = @[_currentPhrase]; 


// Make the share sheet (this works from here onwards if I use a test hardcoded string) 
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil]; 


// Show the share sheet view (this works from here onwards if I use a test hardcoded string) 
[self presentViewController:activityVC animated:YES completion:nil]; 
} 

Примечание: Я попытался с помощью «возврата currentPhrase;» в первом способе, но я получаю «Пустота метод„phraseButtonTapped“не должен возвращать значение».

+0

phraseButtonTapped установлен в 'IBAction', который фактически является' void'. Вот почему вы получаете ошибку «не возвращать значение». – revolver

+0

Возможно, вы тоже захотите прочитать это. http://stackoverflow.com/questions/683211/method-syntax-in-objective-c – Desdenova

+0

Сделайте свой метод следующим образом - (NSString *) phraseButtonTapped, а затем верните currentPhrase. Вы пробовали вот так? –

ответ

0

Проблема одна из scope. Вы нажимаете кнопку, чтобы получить фразу, и сохраните это значение в переменной local. Это означает, что вы можете получить доступ только к этому значению в этом методе.

Другие предложили прочитать значение из текста метки, но это не самая лучшая практика. Если вы учитесь, вы можете хорошо учиться.

Надеюсь, вы слышали о Model-View-Controller, который является стандартным шаблоном, используемым для приложений iOS. Приложение, которое у вас есть, является хорошим примером этого, за исключением того, что вам не хватает части модели.

контролер - ваш объект контроля. вид - это метка, на которой изображена фраза. Модель в вашем случае должна быть NSString на контроллере.

Вместо хранения фразы в локальной переменной сохраните ее в свойстве. Затем он будет доступен для использования в методе совместного доступа.

+0

Спасибо, jrturton. Очень четкое (и доброе) объяснение. Очень ценю это. Я узнал больше всего из вашего единственного ответа. – johnsampson

+0

Счастливые помочь. Если вы чувствуете, что это ответили на ваш вопрос, вы можете принять его, нажав кнопку галочки под партитурой, это позволяет другим знать, что на ваш вопрос был дан ответ. – jrturton

0

если phraseButtonTapped вызываются перед showActivityView: (или если он не имеет значения, вы просто хотите использовать текст phraseLabel, какой бы она есть, в showActivityView:), то вы можете просто использовать self.phraseLabel.text внутри showActivityView: и эффективно передать эту информацию что метод

так попытайтесь идти

NSArray *itemsToShare = @[self.phraseLabel.text]; 
+0

Эй, Феникс, да. этот ответ сработал хорошо. – johnsampson

+0

рад слышать, но, поскольку jrturton сказал, что это не совсем лучшая практика, должна быть какая-то базовая структура данных, к которой вы можете получить доступ, чтобы получить эти значения. но я думаю, может быть, для ваших целей, которые могут быть немного за бортом, если вы просто играете вокруг, так что я бы сказал, что это нормально – Fonix

+0

также вы должны отметить ответ, как ответили, и поднять любые другие полезные ответы, если вы можете – Fonix

-1

Если хотите пройти «нечто» к способу, попробуйте следующий синтаксис

//declaration 
-(id) functionA:(NSArray*) myArray { 

} 

// function call 
[self functionA : myArrayData]; // myArrayData is declared somewhere else 
Смежные вопросы