2015-07-22 3 views
1

В TerningspilletSpillereViewController У меня есть массив, который выглядит следующим образом:массив Доступ к данным из другого контроллера представления

var mineSpillere = ["1SP", "2SP", "3SP"] 

и это под:

func assignArray() { 
    let obj = TerningspilletViewController() 
    obj.mineSpillere2 = self.mineSpillere 
} 

В моих других UIViewController (TerningspilletViewController) У меня есть этот

var mineSpillere2 = [String]() 

Я хочу сгенерировать случайный (1SP, 2SP или 3SP) на нажатие кнопки, как это из функции:

func generateNumber() { 
    let array = aBB 
    let randomIndex = Int(arc4random_uniform(UInt32(array.count))) 

    randomLabel.text = (array[randomIndex]) 
} 

Но это дает мне следующую ошибку:

fatal error: Array index out of range.

I эта линия randomLabel.text = (array[randomIndex])

Почему?

+0

Какая ошибка у вас? Каково точное сообщение об ошибке? – JimiLoe

+0

@JimiLoe - изображение ошибки добавлено в вопрос. –

+0

Измените array.count на array.count - 1. Количество - это общее количество элементов в массиве, но к массиву обращаются по индексу на основе 0, поэтому число 3 действительно означает, что вы можете получить доступ к индексу 0, 1 или 2 –

ответ

1

См. Этот пример и обновите для использования. Я не совсем понимаю ваше наименование, но вы можете получить данные с другого контроллера представлений (который инициализируется данными).

Первый View Controller:

import UIKit 

class ViewController: UIViewController { 

var arrayWithoutData = [String]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    assignArray() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func assignArray() { 

    let otherVC = NextViewController() 
    arrayWithoutData = otherVC.mineSpillere 

    println(arrayWithoutData) 

} 

} 

Second View Controller:

import UIKit 

class NextViewController: UIViewController { 

var mineSpillere = ["1SP","2SP","3SP"] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

} 
+1

Спасибо, это сработало !!!! Нужен ли мне «prepareForSegue»? Что это значит в этом случае? –

+0

В вашем случае это не так. Вы создаете экземпляр контроллера вида, а затем получаете значение из одного из его свойств (созданного вами массива). Если вы хотите перенести данные на разные контроллеры представлений, с которыми пользователь перемещается, вы можете использовать команду подготовки к segue для установки свойств для других контроллеров представлений. Вы можете использовать NSNotificationCenter для отправки данных уже загруженным объектам. –

0

Эта ошибка может возникнуть по двум причинам:

  • изменения длины массива между вызовом array.count и доступ к массиву. Это может произойти только в том случае, если вы назначаете или изменяете массив из другого потока.
  • Массив пуст, и в этом случае arc4random_uniform никогда не сможет создать номер 0<=X<0 (и все, что он вернет, вызовет исключение индекса из-за рубежа).

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

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