2015-03-19 2 views
1

Так что я UIView я объявил во всем мире:Swift: могу ли я передать UIView в качестве аргумента, который я могу создать/изменить?

var speedView: UIView! 

то у меня есть функция, которая принимает UIView в качестве аргумента и создает его:

func buildView(view: UIView!) -> UIView { 
    view = UIView(frame: CGRectMake(0, 0, 200, 100)) 
    ... 
} 

Это не работает потому, что view аргумент автоматически устанавливается на let, которую вы не можете изменить.

Обойти это можно определить как var view... как это:

func buildView(var view: UIView!) -> UIView { ... } 

Делая это технически работает, но позже, если я хочу пойти и изменить self.speedView я не могу получить доступ к нему, потому что он никогда не был создан по этой функции.

Так что:

self.buildView(self.speedView) 

не будет на самом деле создать self.speedView я думаю.

Любые идеи, как я могу это сделать, имеют функцию, которая принимает некоторые глобально определенные представления в качестве аргументов, создает их, а затем я могу получить доступ к этим глобально определенным представлениям?

+0

Почему вы определяете мнения по всему миру? – damian

+1

'inout', возможно, вы ищете здесь? – holex

+0

@damian, потому что я хочу получить доступ и изменить их позже. не только UIViews также UILabels – matt

ответ

0

параметры постоянны по умолчанию - это «пусть», если вы хотите

в большинстве случаев это 100% нормально, и вы не должны изменять параметры


теперь, как вы хотите ВДП вместо этого используйте параметр inout. no Idea ПОЧЕМУ хотя, но так вы можете его изменить.

+0

'inout', когда я определяю его или в аргументах функции? компилятор не очень доволен ни одним из этих ... – matt

+0

func (inout myVar: Type) –

0

Вы уверены, что хотите новый вид? Что об этом:

import UIKit 

class MVViewController11: UIViewController { 

    @IBOutlet weak var speedView: UIView! 
    @IBAction func buttonSelected(sender: AnyObject) { 
     self.buildView(self.speedView) 
    } 

    func buildView(var view: UIView!) { 
     view.backgroundColor = UIColor.redColor() 
     view.frame = CGRectMake(view.frame.origin.x + 10, view.frame.origin.y, view.frame.size.width, view.frame.size.height) 
    } 
} 

EDIT

работает для меня:

import UIKit 

class MVViewController11: UIViewController { 

    @IBOutlet weak var speedView: UIView! 
    @IBAction func buttonSelected(sender: AnyObject) { 
     self.buildView(self.speedView) 
    } 
    @IBAction func button2Selected(sender: AnyObject) { 
     self.builView2(self.speedView) 
    } 

    @IBAction func button3Selected(sender: AnyObject) { 
     self.speedView.backgroundColor = UIColor.yellowColor() 
    } 
    func buildView(var view: UIView!) { 
     view.backgroundColor = UIColor.redColor() 
    } 

    func builView2(var view: UIView!) { 
     view.backgroundColor = UIColor.blueColor() 
    } 
} 

Примечание: speedView подключается через Interface Builder.

+0

, но что если позже появилась другая функция, которая меняет цвет фона вида, например: 'self.speedView.backgroundColor = UIColor. blueColor() '? Я получил бы «фатальную ошибку: неожиданно нашел нуль при разворачивании необязательного значения» – matt

+0

Я отредактировал мое сообщение. – iOSfleer

1

Ok поэтому лучшим решением было использовать inout и &, как показано ниже:

func buildView(inout view: UIView!) -> UIView { ... } 

, а затем может функция, как это:

self.buildView(&self.speedView) 

Вы амперсанд (&) непосредственно перед имя переменной, когда вы передаете ее в качестве аргумента в параметр inout, чтобы указать, что она может быть изменена функцией.

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