如何以编程方式实例化新的视图控制器

时间:2017-02-26 15:22:58

标签: ios swift

我有一个带有两个UIButtons和UIlabels的ViewController。

为了制作类似的ViewController,我想以编程方式实例化一个新的视图控制器 像这样。

let vc = storyboard.instantiateViewControllerWithIdentifier("Main")

然后导航到视图控制器,如下所示:

navigationcontroller?.pushViewController(vc, animated: true)

我已将StoryBoard ID设为"Main",但我不知道在哪里可以编写这些代码。

    class ViewController: UIViewController, AVAudioPlayerDelegate {

    let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3")
    let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3")

        @IBOutlet weak var label1: UILabel!
        @IBOutlet weak var label2: UILabel!

        @IBOutlet weak var yourButton1: customButton!
        @IBOutlet weak var yourButton2: customButton!

        override func viewDidLoad() {
            super.viewDidLoad()

            label1.text = "Hello1"
            label2.text = "Hello2"
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }

   func player(url: URL) {
        do {
            try player = AVAudioPlayer(contentsOf:url)
            player.play()

        } catch {
            print(error)
        }
    }

   @IBAction func pushButton1(sender: UIButton) {
       player(url: url1)
    }

    @IBAction func pushButton2(sender: UIButton) {
       player(url: url2)
    }
        }

的tableView

   class SecondTableViewController: UITableViewController {

    var names = [String]()
    var identities = [String]()

    override func viewDidLoad() {

        names = ["name1","name2","name3","name4"]
        identities = ["Main","Main2","Main3","Main4"]

    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return names.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

        let label1 = cell?.viewWithTag(1) as! UILabel
        label1.text = "\(names[indexPath.row])"

        return cell!
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vcName = identities[indexPath.row]
        let ViewController = storyboard?.instantiateViewController(withIdentifier: vcName)
        self.navigationController?.pushViewController(ViewController!, animated: true)
    }


}

1 个答案:

答案 0 :(得分:4)

您需要在故事板中为视图控制器设置Storyboard ID值,并在此处使用:

var urls1 = [String]()
var urls2 = [String]()

override func viewDidLoad() {

    names = ["name1","name2","name3","name4"]
    identities = ["A","B","C","D"]
    urls1 = ["url1","url2" ....]
    urls2 = ["url1","url2" ....]
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let url1 = urls1[indexPath.row]
    let url2 = urls2[indexPath.row]

//let ViewController = storyboard?.instantiateViewController(withIdentifier: vcName) this is wrong you only have one viewcontroller on storyboard and its storyboard id is fixed.

    let viewController: ViewController  = storyboard?.instantiateViewController(withIdentifier: "StoryboardID") as! ViewController

    viewController.url1 = url1
    viewController.url2 = url2

    self.navigationController?.pushViewController(ViewController!, animated: true)
}

enter image description here

编辑:

private static final String ALL_DIRECT_TEXT_CONTENT =
        "var element = arguments[0], text = '';\n" +
                "for (var i = 0; i < element.childNodes.length; ++i) {\n" +
                "  var node = element.childNodes[i];\n" +
                "  if (node.nodeType == Node.TEXT_NODE" +
                " && node.textContent.trim() != '')\n" +
                "    text += node.textContent.trim();\n" +
                "}\n" +
                "return text;";

public String getText(WebDriver driver, WebElement element) {
    return (String) ((JavascriptExecutor) driver).executeScript(ALL_DIRECT_TEXT_CONTENT, element);
}