objective-c - 关于iOS中viewWithTag的问题?
迷茫
迷茫 2017-04-17 17:30:46
0
1
753

原文地址:链接描述
在这篇文章中有一个简单的项目叫 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 这一行代码到底有什么作用,他虽然加了注释我也不是很明白,求大神回答。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(1)
PHPzhong

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan