Присвойте значение свойству контроллера в Swift

Я пытаюсь передать переменную int между представлениями в Swift, но я не уверен, как получить доступ к другому свойству контроллера представления.

В Objective C я бы сделал что-то вроде этого

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
AnsViewController *ansViewController = [storyBoard instantiateViewControllerWithIdentifier:@"ansView"];
ansViewController.num = theNum;
[self presentViewController:ansViewController animated:YES completion:nil];

И в другом файле viewcontroller.h я бы написал это, чтобы объявить свойство для получения данных

@property (nonatomic) int num;

Теперь для Swift у меня есть это

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let ansViewController : UIViewController = storyBoard.instantiateViewControllerWithIdentifier("ansView") as UIViewController
ansViewController.num = theNum;
self.presentViewController(ansViewController, animated:true, completion:nil)

а в другом файле .swift для другого контроллера представления я объявил num, выполнив

let num: int

Я почти уверен, что это неправильный способ сделать это, потому что я получаю сообщение об ошибке в этой строке

ansViewController.num = theNum;

и он говорит: «UIViewController не имеет члена с именем num». Как мне решить эту ошибку и что я сделал неправильно?

Спасибо


person lagoon    schedule 14.06.2014    source источник
comment
Где эта let num: int строка? Можете ли вы добавить больше кода?   -  person lucianomarisi    schedule 14.06.2014
comment
Я поместил строку let num : int в файл swift для AnsViewController прямо под всеми строками @IBOutlet var.   -  person lagoon    schedule 14.06.2014


Ответы (1)


Проблема

В Objective C вы явно определили ansViewController как AnsViewController*, который имеет свойство num.

Однако в вашем коде Swift вы явно определили ansViewController как UIViewController, а не как AnsViewController. Таким образом, компилятор понятия не имеет, является ли это на самом деле AnsViewController, или каким-то другим подклассом UIViewController, или просто ванильным UIViewController.

Теперь решение.

Мы собираемся попытаться понизить возвращаемое значение как AnsViewController, а затем получить доступ к этому свойству, если преобразование понизится успешно (я предполагаю, что так будет всегда, но вне контекста остального вашего кода и nibs, я могу' т быть уверенным).

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

// To be safe, let's attempt to downcast the returned value as an AnsViewController
if let ansViewController = storyBoard.instantiateViewControllerWithIdentifier("ansView") as? AnsViewController {
    // We get here if the "as?" succeeds with a non-nil value
    ansViewController.num = theNum;
    self.presentViewController(ansViewController, animated:true, completion:nil)
} else {
    // Out of context, I can't see why this case would (or could) ever happen
}

Теперь, если вы знаете, что это всегда будет успешным (из того, что я вижу, возвращаемое значение -instantiateWith... является детерминированным), тогда вы можете быть немного более кратким:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

// Force the downcast as an AnsViewController (this could crash at runtime
// if the return value is nil or not an AnsViewController, so again,
// the previous example is safer
let ansViewController = storyBoard.instantiateViewControllerWithIdentifier("ansView") as AnsViewController
ansViewController.num = theNum;
self.presentViewController(ansViewController, animated:true, completion:nil)
person Ryan    schedule 14.06.2014
comment
Спасибо! Это, кажется, очищает все ошибки, но создает одну новую. Строка, где ansViewController.num = theNum, дает мне ошибку, говорящую о том, что CInt не может быть преобразован в Int. Мне также пришлось изменить часть, где я объявляю num на var num : Int = 0, чтобы избавиться от ошибок. Я должен был это сделать? - person lagoon; 15.06.2014
comment
Я думаю, что получаю эту ошибку, потому что мне пришлось использовать bridgeToObjectiveC().intValue, чтобы получить значение int из текстового поля. - person lagoon; 15.06.2014
comment
Я не уверен, откуда берется theNum, но попробуйте следующее: ansViewController.num = Int(theNum). - person Ryan; 15.06.2014
comment
И причина, по которой это работает, заключается в том, что Swift очень строг в типизации и не рассматривает Ints и CInts как взаимозаменяемые. Вам нужно инициировать новый объект Int из объекта CInt. Int(cInt: CInt) — это, по сути, то, что вызывается, метод инициализации, который создает Int из CInt. - person Ryan; 15.06.2014