如何在同一个viewcontroller上将字符串值从类传递到另一个

时间:2018-05-18 15:47:49

标签: ios swift

我创建了一个由两个类组成的viewcontroller。这些显示如下:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var Viewholder: UIImageView!
    var txt:String?
    override func viewDidLoad() {
        super.viewDidLoad()
        let vv= TestView(frame: Viewholder.frame) 
        view.addSubview(vv)

        txt= "hello"
        let rr = TestView(frame: self.view.frame,textvalue:txt!)

        rr.colour = "" // set value

    }

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

class TestView: UIView {

    var textvalue:String?

    init(frame: CGRect,textvalue) {
        self.textvalue= textvalue
        super.init(frame: frame)
        self.sharedLayout()       
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.frame = frame
        self.setupPaths()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func sharedLayout() {
        print(textvalue!) // works here 
    }

    func setupPaths() {
        print(textvalue!)  // doesnt work here (displays nil)   
    }

如何使其工作,以便“setupPaths”中textvalue的值给出正确的值,以便我可以更改标签的文本。我无法让setuppath函数显示传递的值,因为它返回null。这使我无法使用传递的值编辑标签。

2 个答案:

答案 0 :(得分:0)

您可以像这样创建一个customView

class TestView: UIView {

    var colour:String?

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.sharedLayout()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.sharedLayout()
    }

    init(frame: CGRect,colour:String) {
      self.colour = colour
      super.init(frame: frame)
      self.sharedLayout()
    }
    func sharedLayout() {

    }

}

//

您可以像这样创建

let rr = TestView(frame: self.view.frame,colour:"test")

// rr.colour = "" // set value

答案 1 :(得分:0)

您对面向对象编程非常困惑。在您的代码中:

    let vv= TestView(frame: Viewholder.frame) 
    view.addSubview(vv)

    txt= "hello"
    let rr = TestView(frame: self.view.frame,textvalue:txt!)

let vv行创建一个TestView对象,并将其安装为视图控制器内容视图的子视图。

然后接下来的两行创建一个TestView的新实例,并将文本安装到第二个视图中。然后你忘记了第二个观点。

这就像购买新车,在新车的收音机上设置车站,放弃新车,然后回家,想知道为什么现有车上的广播电台没有改变。这两个对象不是同一个对象,TestView的一个实例中的设置对TestView的另一个实例没有影响。