iOS自定义视图 - 非常奇怪的属性行为



使用swift 2.0

我正在尝试使用标签(不仅仅是)自定义视图在屏幕上显示一些信息,因此我的想法是将自定义视图添加到ViewController上的ScrollView,并设置标签的文本(首先)

问题:我只是无法获得我想设置标签文本的标签和字符串的瞬间,并且由于某种原因,字符串在末端null null null。

因此,我进行了大规模调试,以显示每一刻每个VAR的状态,这使我更加困惑:(这是Xcode的日志输出)

my init was called, fatura String value: Optional("random text")
init with coder was called
 - On awake from Nib
Label outlet is NOT null
fatura String is null
view loaded from Nib was added
 - On Setup
Label outlet is null
fatura String is NOT null
checking fatura String value from ViewController: Optional("random text")
 - On ViewController's viewDidLoad
Label outlet is null
fatura String is NOT null
 - On ViewController's viewWillAppear
Label outlet is null
fatura String is NOT null
 - On Button touched action
Label outlet is NOT null
fatura String is null

我是iOS的新手,来自Android开发的几年,我想真正了解发生了什么,因此,任何 good 文章和书籍也将受到欢迎。我在自定义视图上找到了很多东西,但是它们都有些不同,所以我不知道要使用哪一个,而且它们主要是实现的,没有任何解释。

问题:

  • 为什么在加载笔尖视图之前,vencimentolb标签的插座以"非null"开始?

  • 为什么fatura string null在*我的初始化之后被列出了?*至少那是日志告诉我的

  • 为什么我的fatura字符串在纽扣动作上是无效的?

总结:如何获得标签和字符串而不是null,因此要在标签上设置文本?

我知道这是很多问题,所以对他们中的任何一个的答案都非常感谢

"解决方案"找到:

致电customView.iw。查看以迫使插座开始安装。这是行不通的(除了我创建的一个customview没有视图成员,并且没有区别)

自定义视图的代码:

class FaturaCard: UIView {
    var view:UIView!
    @IBOutlet var vencimentoLb: UILabel!
    @IBOutlet var cardView: UIView!
    var fatura:String?
    init(string:String , frame:CGRect){
        fatura = string
        print("my init was called, fatura String value:",self.fatura)
        super.init(frame: frame)
        setup()
    }
    override init(frame: CGRect){
        super.init(frame:frame)
        print("init with frame was called")
        setup()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("init with coder was called")
    }
    @IBAction func onBotaoClicked(sender: AnyObject) {
        print("n - On Button touched action")
        checksWhatsNull()
    }
    func setup(){
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        addSubview(view)
        print("view loaded from Nib was added")
        print("n - On Setup")
        checksWhatsNull()
    }
    func checksWhatsNull(){
        if vencimentoLb == nil{
            print("Label outlet is null")
        }else{
            print("Label outlet is NOT null")
        }
        if self.fatura == nil{
            print("fatura String is null")
        }else{
            print("fatura String is NOT null")
        }
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        print("n - On awake from Nib")
        checksWhatsNull()
    }
    func loadViewFromNib() -> UIView{
        let nib = UINib(nibName: "FaturaCard", bundle: nil)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        return view
    }
}

编辑:

自定义查看实例代码:

var view2:FaturaCard!
override func viewDidLoad() {
        super.viewDidLoad()
        view2 = FaturaCard(string:"random text",frame: CGRect(x: 00, y:145, width: scrollView.bounds.size.width, height: 145))
        print("checking fatura String value from ViewController:",view2.fatura)
        self.scrollView.addSubview(view2)
        print("n - On ViewController's viewDidLoad")
        view2.checksWhatsNull()
        self.scrollView.contentSize.height=145*2
    }

您在问题中的日志中有两个输出。

这意味着您正在加载自定义视图的两个实例。

您看到的日志来自不同的实例,具体取决于操作 - 值不变,您从不同实例中看到了值。

print(self)添加到您的记录中应该有望清楚。

init(coder:)将是从笔尖或故事板创建视图时。您正在使用自定义初始化(在日志中看到的)创建视图,然后在setUp方法中创建视图的 second 实例,然后将其保留在原始内容中。这是不对的。

我认为您已经阅读了有关访问view的迫使要加载的视图,并尝试在此处执行此操作 - 这适用于查看 Controller ,而不是视图,并且根本不适用你的情况。

您可能应该直接从笔尖创建视图,然后设置fatura属性 - 不可能从问题中的内容中分辨出来,但是我认为您的插座指向主视图本身,而不是文件所有者,因此您可以与NIL的所有者一起创建。

查看您的更新代码,您可能想要这样的东西。

而不是在ViewDidload中的这一行:

view2 = FaturaCard(string:"random text",frame: CGRect(x: 00, y:145, width: scrollView.bounds.size.width, height: 145))

使用此:

let nib = UINib(nibName: "FaturaCard", bundle: nil)
view2 = nib.instantiateWithOwner(nil, options: nil)[0] as! FaturaCard
view2.frame = CGRect(x: 00, y:145, width: scrollView.bounds.size.width, height: 145)
view2.fatura = "Random Text"

它是从笔尖的尴尬加载视图,理想情况下,您将这些东西放在FaturaCard上的类方法中

所以,最终问题是在接口构建器中。

我已经在笔尖的主视图中,而不是在文件的所有者占位符中设置自定义类属性。这创建了Faturacard视图中" Faturacard"自定义视图的实例,因此立即创建了两个实例(如Jrturton的答案所述),由Init(Coder :)初始化的第二个实例(在jrturton的答案上说),这造成了所有这些麻烦。

这是一个初学者的错误,一个非常令人困惑的错误。

相关内容

  • 没有找到相关文章

最新更新