Saya sedang menulis aplikasi dan saya perlu mengubah tampilan jika pengguna melihat aplikasi sambil berbicara di telepon.
Saya telah menerapkan metode berikut:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"viewWillAppear:");
_sv.frame = CGRectMake(0.0, 0.0, 320.0, self.view.bounds.size.height);
}
Tapi itu tidak dipanggil ketika aplikasi kembali ke latar depan.
Saya tahu bahwa saya dapat menerapkan:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
tetapi saya tidak ingin melakukan ini. Saya lebih suka meletakkan semua informasi tata letak saya di metode viewWillAppear:, dan biarkan itu menangani semua skenario yang mungkin.
Saya bahkan sudah mencoba memanggil viewWillAppear: from applicationWillEnterForeground :, tapi saya tidak bisa menunjukkan dengan tepat yang mana merupakan view controller saat ini.
Adakah yang tahu cara yang tepat untuk menangani ini? Saya yakin saya kehilangan solusi yang jelas.
ios
objective-c
iphone
viewwillappear
Philip Walton
sumber
sumber
applicationWillEnterForeground:
untuk menentukan kapan aplikasi Anda telah memasuki kembali status aktif.isMemberOfClass
atauisKindOfClass
, tergantung pada kebutuhan Anda.Jawaban:
Metode ini
viewWillAppear
harus diambil dalam konteks apa yang terjadi di aplikasi Anda sendiri, dan tidak dalam konteks aplikasi Anda ditempatkan di latar depan ketika Anda kembali ke sana dari aplikasi lain.Dengan kata lain, jika seseorang melihat aplikasi lain atau melakukan panggilan telepon, kemudian beralih kembali ke aplikasi Anda yang sebelumnya di latar belakang, UIViewController Anda yang sudah terlihat ketika Anda meninggalkan aplikasi Anda 'tidak peduli' untuk berbicara - sejauh menyangkut, itu tidak pernah menghilang dan masih terlihat - dan
viewWillAppear
tidak disebut.Saya sarankan untuk tidak menyebut
viewWillAppear
diri Anda sendiri - itu memiliki makna khusus yang tidak boleh Anda ubah! Refactoring yang dapat Anda lakukan untuk mencapai efek yang sama mungkin sebagai berikut:Kemudian Anda juga memicu
doMyLayoutStuff
dari notifikasi yang sesuai:Tidak ada cara di luar kotak untuk mengetahui UIViewController 'saat ini'. Tetapi Anda dapat menemukan cara-cara di sekitar itu, misalnya ada metode delegasi dari UINavigationController untuk mencari tahu kapan UIViewController disajikan di dalamnya. Anda bisa menggunakan hal itu untuk melacak UIViewController terbaru yang telah disajikan.
Memperbarui
Jika Anda tata letak UI dengan masker autoresizing yang sesuai pada berbagai bit, kadang-kadang Anda bahkan tidak perlu berurusan dengan meletakkan 'manual' dari UI Anda - itu hanya akan ditangani ...
sumber
self.navigationController.topViewController
secara efektif menyediakannya, atau setidaknya yang ada di atas tumpukan, yang akan menjadi saat ini jika kode ini diaktifkan pada utas utama di view contoller. (Bisa jadi salah, belum sering bermain dengannya, tetapi tampaknya berhasil.)appDelegate.rootViewController
akan bekerja juga, tetapi mungkin mengembalikanUINavigationController
, dan kemudian Anda akan perlu.topViewController
seperti yang dikatakan @MatthewFrederick.Cepat
Jawaban singkat
Gunakan
NotificationCenter
pengamat daripadaviewWillAppear
.Jawaban panjang
Untuk mengetahui kapan aplikasi kembali dari latar belakang, gunakan
NotificationCenter
pengamat daripadaviewWillAppear
. Berikut adalah contoh proyek yang menunjukkan peristiwa mana yang terjadi kapan. (Ini adalah adaptasi dari jawaban Objective-C ini .)Pada saat pertama memulai aplikasi, urutan output adalah:
Setelah menekan tombol beranda dan kemudian membawa aplikasi kembali ke latar depan, urutan output adalah:
Jadi jika Anda awalnya mencoba menggunakan
viewWillAppear
makaUIApplication.willEnterForegroundNotification
mungkin itu yang Anda inginkan.Catatan
Pada iOS 9 dan yang lebih baru, Anda tidak perlu menghapus pengamat. Itu dokumentasi menyatakan:
sumber
Gunakan Pusat Pemberitahuan dalam
viewDidLoad:
metode ViewController Anda untuk memanggil metode dan dari sana lakukan apa yang seharusnya Anda lakukan dalamviewWillAppear:
metode Anda . MeneleponviewWillAppear:
langsung bukanlah pilihan yang baik.sumber
dealloc
metode itu.viewWillAppear:animated:
, salah satu metode yang paling membingungkan dalam SDK iOS menurut saya, tidak pernah terlibat dalam situasi seperti itu, yaitu, pengalihan aplikasi. Metode itu hanya dipanggil sesuai dengan hubungan antara tampilan pengontrol tampilan dan jendela aplikasi , yaitu, pesan dikirim ke pengontrol tampilan hanya jika pandangannya muncul di jendela aplikasi, bukan di layar.Ketika aplikasi Anda berjalan di latar belakang, jelas tampilan paling atas dari jendela aplikasi tidak lagi terlihat oleh pengguna. Namun, dalam perspektif jendela aplikasi Anda, mereka masih merupakan tampilan teratas dan karenanya mereka tidak menghilang dari jendela. Sebaliknya, pandangan itu menghilang karena jendela aplikasi menghilang. Mereka tidak menghilang karena mereka menghilang dari jendela.
Karena itu, ketika pengguna beralih kembali ke aplikasi Anda, mereka jelas tampak muncul di layar, karena jendela itu muncul lagi. Tapi dari perspektif jendela, mereka belum menghilang sama sekali. Karenanya pengendali tampilan tidak pernah menerima
viewWillAppear:animated
pesan.sumber
Swift 4.2 / 5
sumber
Hanya berusaha membuatnya semudah mungkin lihat kode di bawah ini:
sumber