cari

Rumah  >  Soal Jawab  >  teks badan

objective-c - 关于iOS中viewWithTag的问题?

原文地址:链接描述
在这篇文章中有一个简单的项目叫 BeginnerCook Starter ,其中一个ViewController+.swift的文件中有这样一段代码:

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
        if listView.subviews.count < herbs.count {
            listView.viewWithTag(0)?.tag = 1000 //prevent confusion when looking up images
            setupList()
        }
    }

listView.viewWithTag(0)?.tag = 1000 这一行代码到底有什么作用,他虽然加了注释我也不是很明白,求大神回答。

迷茫迷茫2814 hari yang lalu774

membalas semua(1)saya akan balas

  • PHPz

    PHPz2017-04-17 17:32:46

    Dia kemudiannya menggunakan teg bermula dari 0 untuk mengenal pasti setiap UIIamgeView, jadi dia perlu menukar teg paparan yang 0 dalam listView (jenisnya UIScrollView) untuk mengelakkan pertindihan dengan teg yang dia tambah kemudian .


    Ternyata analisis di bawah ini tidak jelas Ideanya salah tetapi kesimpulannya betul. Dikemas kini seperti berikut:

    Jumlah skor dan struktur: Kesimpulan asal adalah betul Pandangan yang tegnya ditukar daripada 0 kepada 1000 ialah bar skrol mendatar, tetapi ideanya salah. . . Walaupun ia tidak ditunjukkan dalam jawapan, saya akan menambahnya secara terperinci


    Mula-mula tulis dua perkara yang boleh dipelajari daripada dokumen:

    Perisytiharan tag secara pantas adalah seperti ini: var tag: Int Dan terdapat perenggan ini di bawah dokumen:

    Perbincangan
    Nilai lalai ialah 0. Anda boleh menetapkan nilai teg ini dan menggunakan nilai itu untuk mengenal pasti paparan kemudian.

    Dapat dilihat di sini bahawa jenis teg bukan pilihan, yang bermaksud UIView mesti mempunyai teg Perbincangan menunjukkan bahawa nilai lalai ialah 0.

    Antara muka dalam soalan kini kelihatan seperti ini:

    listView(UIScrollView): tag == 1000 // 1
      |-横滚动条(UIView): tag == 0

    Nota 1: Betul. . . Dia menetapkan teg listView kepada 1000 dalam StoryBoard, seperti yang ditunjukkan di bawah. Bar skrol mendatar tidak diubah suai di sini kerana sukar untuk menetapkan teg dalam StoryBoard. Ingat ini dan gunakannya dengan segera.

    (tag di sudut kanan bawah = 1000)

    Kemudian dokumen - viewWithTag: mengandungi perenggan berikut

    Perbincangan

    Kaedah ini mencari paparan semasa dan semua subviewnya untuk paparan yang ditentukan.

    Kaedah

    `viewWithTag:` mencari pandangan itu sendiri dan subviewnya.

    Seperti yang dinyatakan di atas, teg listView telah ditukar kepada 1000 dalam StoryBoard Oleh itu, apabila melaksanakan listview.viewWithTag(0) dalam soalan, perkara pertama yang ditemui bukanlah listView itu sendiri, tetapi bar skrol dalam subviewnya. Kemudian tukar teg bar skrol kepada 1000

    Jadi kembali kepada kesimpulan sebelumnya, pandangan dengan tag 0 ialah:

    Bar skrol mendatar XD. . .


    Keupayaan saya untuk menyatakan diri saya terhad. . . Ia adalah perkara yang sangat mudah sehingga saya hampir berasa pening. Lebih baik saya berikan contoh:


    Kod taman permainan dalam gambar:

    import UIKit
    
    let viewA = UIView(frame: CGRect(x: 0,y: 0,width: 30,height: 30))
    let viewB = UIView(frame: CGRect(x: 0,y: 0,width: 20,height: 20))
    viewA.backgroundColor = UIColor.darkGrayColor()
    viewB.backgroundColor = UIColor.greenColor()
    viewA.addSubview(viewB)
    
    viewA
    viewB
    
    viewA.tag // 0 为了截图方便,不预览了
    viewB.tag // 0 为了截图方便,不预览了
    
    viewA.viewWithTag(0) // 现在获取到 viewA 自己
    
    viewA.tag = 1000     // StroyBoard 中设置了 tag 为 1000
    viewA.viewWithTag(0) // 获取到 viewB
    
    viewA.viewWithTag(0)?.tag = 1000 // 把 viewB 的 tag 也改成 1000
    viewA.viewWithTag(0) // 这时结果时 nil
    
    // setupList()
    let imageView0 = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
    imageView0.backgroundColor = UIColor.redColor()
    viewA.addSubview(imageView0)
    viewA
    
    viewA.viewWithTag(0) // 拿到了想要的 iamgeView0
    

    balas
    0
  • Batalbalas