Saya sedang membangun aplikasi iOS menggunakan Storyboard. Pengontrol tampilan root adalah Pengontrol Tab Bar. Saya membuat proses masuk / keluar, dan sebagian besar berfungsi dengan baik, tapi saya punya beberapa masalah. Saya perlu tahu cara TERBAIK untuk mengatur semua ini.
Saya ingin mencapai yang berikut:
- Tampilkan layar masuk saat aplikasi pertama kali diluncurkan. Saat mereka masuk, buka tab pertama dari Pengontrol Tab Bar.
- Setiap kali mereka meluncurkan aplikasi setelah itu, periksa apakah mereka masuk, dan lewati langsung ke tab pertama dari Pengontrol Tab Bar root.
- Ketika mereka secara manual mengklik tombol logout, perlihatkan layar login, dan hapus semua data dari pengontrol tampilan.
Apa yang telah saya lakukan sejauh ini adalah mengatur pengontrol tampilan root ke Pengontrol Tab Bar, dan membuat segue khusus untuk pengontrol tampilan Login saya. Di dalam kelas Pengontrol Tab Bar saya, saya memeriksa apakah mereka masuk di dalam viewDidAppear
metode, dan melakukan segue:[self performSegueWithIdentifier:@"pushLogin" sender:self];
Saya juga mengatur pemberitahuan kapan tindakan logout perlu dilakukan: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutAccount) name:@"logoutAccount" object:nil];
Setelah keluar, saya menghapus kredensial dari Gantungan Kunci, menjalankan [self setSelectedIndex:0]
dan melakukan segue untuk menampilkan kembali pengontrol tampilan login.
Ini semua berfungsi dengan baik, tapi saya bertanya-tanya: haruskah logika ini ada di AppDelegate? Saya juga punya dua masalah:
- Pertama kali mereka meluncurkan aplikasi , Kontroler Tab Bar menunjukkan sebentar sebelum segue dilakukan. Saya sudah mencoba memindahkan kode ke
viewWillAppear
tetapi segue tidak akan bekerja lebih awal. - Saat mereka keluar, semua data masih di dalam semua pengontrol tampilan. Jika mereka masuk ke akun baru, data akun lama masih ditampilkan sampai mereka menyegarkan. Saya perlu cara untuk menghapus ini dengan mudah di logout.
Saya terbuka untuk mengerjakan ulang ini. Saya telah mempertimbangkan menjadikan layar masuk pengontrol tampilan root, atau membuat pengontrol navigasi di AppDelegate untuk menangani semuanya ... Saya hanya tidak yakin apa metode terbaik pada saat ini.
Jawaban:
Di appDelegate.m Anda di dalam didFinishLaunchingWithOptions Anda
Dalam file SignUpViewController.m
Dalam file MyTabThreeViewController.m
Versi Swift 4
didFinishLaunchingWithOptions dalam delegasi aplikasi dengan asumsi pengontrol tampilan awal Anda adalah yang terdaftar di TabbarController.
Di Daftar pengendali tampilan:
MyTabThreeViewController
sumber
AppDelegate
bagian dalamUIViewController
dan pengaturan diwindow.rootViewController
sana. Saya tidak menganggap ini sebagai "praktik terbaik".-1
tanpa memposting jawaban: stackoverflow.com/a/30664935/1226304AppDelegate
di dalamUIViewController
-1 untuk Menyimpan kunci masukNSUserDefaults
. Sangat-sangat tidak aman untuk data seperti itu!Inilah yang akhirnya saya lakukan untuk menyelesaikan segalanya. Satu-satunya hal yang perlu Anda pertimbangkan selain ini adalah (a) proses login dan (b) di mana Anda menyimpan data aplikasi Anda (dalam hal ini, saya menggunakan singleton).
Seperti yang Anda lihat, pengontrol tampilan root adalah milik saya Pengontrol Tab Utama . Saya melakukan ini karena setelah pengguna masuk, saya ingin aplikasi langsung diluncurkan ke tab pertama. (Ini menghindari "flicker" di mana tampilan login menunjukkan sementara.)
AppDelegate.m
Dalam file ini, saya memeriksa apakah pengguna sudah masuk. Jika tidak, saya mendorong pengontrol tampilan login. Saya juga menangani proses logout, tempat saya membersihkan data dan memperlihatkan tampilan login.
LoginViewController.m
Di sini, jika login berhasil, saya cukup mengabaikan tampilan dan mengirim pemberitahuan.
sumber
[self.window makeKeyAndVisible]; [self.window.rootViewController presentViewController:viewController animated:animated completion:nil];
denganself.window.rootViewController = viewController;
untuk mencegah flicker. Untuk menghidupkan yang hanya membungkusnya dalam[UIView transitionWithView...];
EDIT: Tambahkan tindakan logout.
1. Pertama-tama siapkan file delegasi aplikasi
AppDelegate.h
AppDelegate.m
2. Buat kelas bernama Pengguna.
User.h
Pengguna.m
3. Buat controller RootViewController baru dan terhubung dengan tampilan pertama, tempat tombol login hidup. Tambahkan juga ID Storyboard: "initialView".
RootViewController.h
RootViewController.m
4. Buat controller baru LoginViewController dan terhubung dengan tampilan login.
LoginViewController.h
LoginViewController.m
5. Pada akhirnya tambahkan controller ProfileViewController baru dan terhubung dengan tampilan profil di tabViewController.
ProfileViewController.h
ProfileViewController.m
LoginExample adalah proyek sampel untuk bantuan ekstra.
sumber
Saya tidak suka jawaban bhavya karena menggunakan
AppDelegate
di dalam View Controllers dan pengaturanrootViewController
tidak memiliki animasi. Dan jawaban Trevor memiliki masalah dengan pengontrol tampilan berkedip di iOS8.UPD 07/18/2015
AppDelegate di dalam View Controllers:
Mengubah status AppDelegate (properti) di dalam view controller merusak enkapsulasi.
Hirarki objek yang sangat sederhana di setiap proyek iOS:
AppDelegate (memiliki
window
danrootViewController
)ViewController (memiliki
view
)Tidak apa-apa bahwa objek dari atas mengubah objek di bagian bawah, karena mereka membuatnya. Tapi tidak apa-apa jika objek di bawah mengubah objek di atasnya (saya jelaskan beberapa prinsip dasar pemrograman / OOP: DIP (Prinsip Ketergantungan Pembalikan: modul tingkat tinggi tidak boleh bergantung pada modul tingkat rendah, tetapi mereka harus bergantung pada abstraksi) ).
Jika ada objek yang akan mengubah objek apa pun dalam hierarki ini, cepat atau lambat akan ada kekacauan dalam kode. Mungkin ok di proyek kecil tapi tidak menyenangkan untuk menggali kekacauan ini di proyek bit =]
UPD 07/18/2015
Saya meniru animasi pengontrol modal menggunakan
UINavigationController
(tl; dr: periksa proyek ).saya menggunakan
UINavigationController
untuk menyajikan semua pengontrol di aplikasi saya. Awalnya saya menampilkan pengontrol tampilan login di tumpukan navigasi dengan animasi push / pop biasa. Daripada saya memutuskan untuk mengubahnya ke modal dengan perubahan minimal.Bagaimana itu bekerja:
Pengontrol tampilan awal (atau
self.window.rootViewController
) adalah UINavigationController dengan ProgressViewController sebagai arootViewController
. Saya menunjukkan ProgressViewController karena DataModel dapat mengambil beberapa waktu untuk menginisialisasi karena inits tumpukan data inti seperti dalam artikel ini (saya sangat suka pendekatan ini).AppDelegate bertanggung jawab untuk mendapatkan pembaruan status login.
DataModel menangani login / keluar pengguna dan AppDelegate mengamati
userLoggedIn
properti itu melalui KVO. Bisa dibilang bukan metode terbaik untuk melakukan ini tetapi itu bekerja untuk saya. (Mengapa KVO buruk, Anda dapat memeriksa bagian ini atau artikel ini (Mengapa Tidak Menggunakan Pemberitahuan?).ModalDismissAnimator dan ModalPresentAnimator digunakan untuk menyesuaikan animasi push standar.
Cara kerja logika animator:
AppDelegate menetapkan dirinya sebagai delegasi dari
self.window.rootViewController
(yang merupakan UINavigationController).AppDelegate mengembalikan salah satu animator
-[AppDelegate navigationController:animationControllerForOperation:fromViewController:toViewController:]
jika perlu.Animator menerapkan
-transitionDuration:
dan-animateTransition:
metode.-[ModalPresentAnimator animateTransition:]
:Proyek uji ada di sini .
sumber
AppDelegate
(saya akan tertarik untuk memahami mengapa Anda melakukannya) - tetapi komentar Anda tentang kurangnya animasi sangat valid. Itu bisa dipecahkan dengan jawaban ini: stackoverflow.com/questions/8053832/…UITabBarController
untuk waktu yang lama. Saya mungkin akan mulai dengan pendekatan jendela alih-alih memanipulasi pengontrol tampilan.Inilah solusi Swifty saya untuk setiap penonton di masa depan.
1) Buat protokol untuk menangani fungsi masuk dan keluar:
2) Perluas protokol tersebut dan berikan fungsionalitas di sini untuk keluar:
3) Lalu saya bisa menyesuaikan AppDelegate saya dengan protokol LoginFlowHandler, dan memanggil
handleLogin
startup:Dari sini, ekstensi protokol saya akan menangani logika atau menentukan apakah pengguna jika masuk / keluar, dan kemudian mengubah windows rootViewController sesuai!
sumber
LoginFlowHandler
. Apakah saya melewatkan sesuatu? Juga, saya menduga kode ini hanya mengelola login saat start up. Bagaimana cara saya mengelola logout dari pengontrol tampilan?AppState
Implementasi ini karena itu akan tergantung pada bagaimana Anda menyimpan data pengguna Anda ke disk.handleLogout
fungsionalitas?LoginFlowHandler
protokol. Kemudian Anda akan mendapatkan ruang lingkup untuk dapat memanggil metode handleLogout. Lihat langkah 3 saya untuk contoh bagaimana saya melakukan itu untuk kelas AppDelegate.Melakukan ini dari delegasi aplikasi TIDAK dianjurkan. AppDelegate mengelola siklus hidup aplikasi yang terkait dengan peluncuran, penangguhan, penghentian, dan sebagainya. Saya sarankan melakukan ini dari pengontrol tampilan awal Anda di
viewDidAppear
. Anda dapatself.presentViewController
danself.dismissViewController
dari pengontrol tampilan login. Simpanbool
kunciNSUserDefaults
untuk melihat apakah itu diluncurkan untuk pertama kali.sumber
Setelah membuat LoginViewController dan TabBarController , kita perlu menambahkan StoryboardID masing-masing sebagai " loginViewController " dan " tabBarController ".
Maka saya lebih suka membuat struct Constant :
Di LoginViewController tambahkan IBAction :
Di ProfileViewController tambahkan IBAction :
Di AppDelegate tambahkan baris kode di didFinishLaunchingWithOptions :
Akhirnya buat kelas Switcher :
Itu semuanya!
sumber
Di Xcode 7 Anda dapat memiliki beberapa storyBoards. Akan lebih baik jika Anda dapat menyimpan alur Login di storyboard terpisah.
Ini dapat dilakukan dengan menggunakan SELECT VIEWCONTROLLER> Editor> Refactor to Storyboard
Dan di sini adalah versi Swift untuk menetapkan tampilan sebagai RootViewContoller-
sumber
Saya menggunakan ini untuk memeriksa peluncuran pertama:
(jika pengguna menghapus aplikasi dan menginstalnya kembali, itu dianggap seperti peluncuran pertama)
Di AppDelegate saya memeriksa peluncuran pertama dan membuat pengontrol navigasi dengan layar login (login dan daftar), yang saya letakkan di atas jendela utama saat ini:
Karena ini ada di atas pengontrol tampilan biasa, pengontrol independen dari aplikasi Anda dan Anda dapat mengabaikan pengontrol tampilan, jika Anda tidak membutuhkannya lagi. Dan Anda juga dapat menyajikan tampilan dengan cara ini, jika pengguna menekan tombol secara manual.
BTW: Saya menyimpan data masuk dari pengguna saya seperti ini:
Untuk logout: Saya beralih dari CoreData (terlalu lambat) dan menggunakan NSArrays dan NSDictionaries untuk mengelola data saya sekarang. Logout berarti mengosongkan array dan kamus tersebut. Plus saya memastikan untuk mengatur data saya di viewWillAppear.
Itu dia.
sumber
Saya berada dalam situasi yang sama dengan Anda dan solusi yang saya temukan untuk membersihkan data menghapus semua hal-hal CoreData yang diandalkan oleh pengontrol tampilan saya untuk menggambar info itu. Tetapi saya masih menemukan pendekatan ini sangat buruk, saya pikir cara yang lebih elegan untuk melakukan ini dapat dicapai tanpa storyboard dan hanya menggunakan kode untuk mengelola transisi antara pengontrol tampilan.
Saya telah menemukan proyek ini di Github yang melakukan semua ini hanya dengan kode dan sangat mudah dimengerti. Mereka menggunakan menu samping seperti Facebook dan yang mereka lakukan adalah mengubah pengontrol tampilan tengah tergantung apakah pengguna masuk atau tidak. Ketika pengguna keluar,
appDelegate
menghapus data dari CoreData dan menetapkan pengontrol tampilan utama ke layar login lagi.sumber
Saya memiliki masalah serupa untuk dipecahkan dalam suatu aplikasi dan saya menggunakan metode berikut. Saya tidak menggunakan notifikasi untuk menangani navigasi.
Saya memiliki tiga storyboard di app.
Storyboard awal saya di app adalah storyboard layar Splash. Saya memiliki pengontrol navigasi sebagai root dari login dan storyboard tab bar untuk menangani navigasi pengontrol tampilan.
Saya membuat kelas Navigator untuk menangani navigasi aplikasi dan tampilannya seperti ini:
Mari kita lihat skenario yang mungkin:
Karena saya memiliki pengontrol navigasi sebagai root, saya instantiate pengontrol navigasi sebagai pengontrol tampilan awal.
Ini menghapus storyboard slpash dari root jendela aplikasi dan menggantinya dengan storyboard login.
Dari papan cerita masuk, ketika pengguna berhasil masuk, saya menyimpan data pengguna ke Default Pengguna dan menginisialisasi singleton UserData untuk mengakses detail pengguna. Kemudian storyboard Tab bar dimuat menggunakan metode navigator.
Sekarang pengguna keluar dari layar pengaturan di bilah tab. Saya menghapus semua data pengguna yang disimpan dan menavigasi ke layar masuk.
Saat pengguna meluncurkan aplikasi, layar Splash akan dimuat. Saya memeriksa apakah pengguna masuk dan mengakses data pengguna dari Default Pengguna. Kemudian inisialisasi singleton UserData dan tampilkan bilah tab alih-alih layar masuk.
sumber
Terima kasih solusi bhavya. Ada dua jawaban tentang swift, tetapi itu tidak terlalu utuh. Saya telah melakukannya di swift3. Di bawah ini adalah kode utama.
Di AppDelegate.swift
Di SignUpViewController.swift
Dalam fungsi logOutAction
sumber
masukkan deskripsi gambar di sini
Di App Delegate.m
}
view controller.m Dalam pandangan memang memuat
}
Dalam aksi tombol logout
sumber
NSUserDefaults
sangat tidak aman untuk data seperti itu!