来自 segue 或 NSUserdefault 的 UIViewController 选项数据

Posted

技术标签:

【中文标题】来自 segue 或 NSUserdefault 的 UIViewController 选项数据【英文标题】:UIViewController option data from segue or NSUserdefault 【发布时间】:2016-01-06 09:19:41 【问题描述】:

我在控制器之间传递数据时遇到问题。在需求中,我使用了标签栏,有“搜索人物视图”和“个人资料视图”的根目录。当我单击个人资料视图时,数据来自我的NSUserDefaults 数据,但如果我从搜索人员视图中单击人员单元格,则配置文件视图应显示人员单元格中的数据。我很困惑如何处理这种情况。是否可以识别配置文件视图中的 segue 标识符。 请帮忙,更喜欢swift代码

更新:

这是我关于“搜索人物视图”的代码:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "ShowAlumniAngkatan" 
        if let destination = segue.destinationViewController as? DetailProfile
            let indexPath = ListAlumniTable.indexPathForSelectedRow
            let data = SearchResult[indexPath!.row]
        
    

以下是“个人资料视图”代码:

class ProfileDetailsViewController: UIViewController 


@IBOutlet weak var BackgroundImage: UIImageView!
@IBOutlet weak var ProfileTable: UITableView!
@IBOutlet weak var ProfilePictureImage: UIImageView!

var Profiles:DetailProfile!
var contacts:[Contact] = [Contact]()
var work:[Work] = [Work]()
var advise:String!

var SeeMoreEnbable:Bool!

override func viewDidLoad() 
    super.viewDidLoad()
    InitializationView()
    SeeMoreEnbable = false
    getData()




override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
    self.view.endEditing(true)


// MARK - Init View
func InitializationView()
    blurImage()
    circleImage()


func getData()
    let defaults = NSUserDefaults.standardUserDefaults().objectForKey("UserDetail") as! [NSData]
    self.advise = NSKeyedUnarchiver.unarchiveObjectWithData(defaults[3] as NSData) as! String
    let temp1 =  NSKeyedUnarchiver.unarchiveObjectWithData(defaults[2] as NSData) as! [NSArray]
    for data in temp1
        let jabatan = NSKeyedUnarchiver.unarchiveObjectWithData(data[0] as! NSData) as! String
        let perusahaan = NSKeyedUnarchiver.unarchiveObjectWithData(data[1] as! NSData) as! String
        let tahunkerja = NSKeyedUnarchiver.unarchiveObjectWithData(data[2] as! NSData) as! String
        self.work.append(Work(Jabatan: jabatan, Perusahaan: perusahaan, TahunKerja: tahunkerja))
        print(work[0].Jabatan)
        print(work.count)

    
    let temp2 =  NSKeyedUnarchiver.unarchiveObjectWithData(defaults[1] as NSData) as! [NSArray]
    for data in temp2
        let Type = NSKeyedUnarchiver.unarchiveObjectWithData(data[0] as! NSData) as! String
        let Detail = NSKeyedUnarchiver.unarchiveObjectWithData(data[1] as! NSData) as! String
        self.contacts.append(Contact(ContactType: Type, ContactDetail: Detail))
    

我已经在搜索人员视图上实现了prepareForSegue,它应该从选定的行发送数据。但我不知道从 segue 或 NSUserDefaults 中选择数据。

【问题讨论】:

贴上代码方便读者理解 你只需要创建一个 profileVC 的实例并将数据作为属性传递给它,然后再用 segue 呈现它 【参考方案1】:

您需要在情节提要中为 segue 提供 identifier。然后在您的“搜索人员视图”控制器中实现prepareForSegue 方法。通过使用这种方法,您可以将数据设置到下一个视图控制器(配置文件视图),方法是将它们存储在一些配置文件视图的字段变量中。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
  super.prepareForSegue(segue, sender: sender)

  if let vc = segue.destinationViewController as? ProfileViewController 
    vc.profileData = selectedProfileData
  

【讨论】:

我已经实现了您的代码,但无法选择必须在配置文件视图中显示的数据 哦等等,我误解了你的问题。问题是你有一些奇怪的用户体验。为什么要选择选项卡栏上的个人资料来显示您已搜索并可能在表格视图中单击的人的个人资料?这是没有意义的。尝试将个人资料选项卡按钮仅保留在您自己的个人资料中,并且您可以在单击搜索的人时重用布局和代码以显示详细信息(推送详细信息 segue)。【参考方案2】:

如果您使用的是标签栏控制器,那么您可以使用以下方法来传递数据 b/w 视图控制器

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool 
     if(viewController.isKindOfClass(AddReminderViewController))
            let vc = viewController as! AddReminderViewController
            vc.name = "Demo"
     
     return false   

【讨论】:

我必须在哪里添加该代码?在 UITabBarController 中没有那个功能

以上是关于来自 segue 或 NSUserdefault 的 UIViewController 选项数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift:以编程方式枚举来自 UIVIewController 的传出 segue

来自一个视图控制器的两个segue,prepareForSegue

如何根据来自另一个线程的 JSON 结果确定是不是执行 segue

来自 UICollectionView ReusableView (header) 的 Popover segue

如何通过来自同一个 TableViewController 的多个 segue 到同一个 ViewController

以编程方式从 UIView 执行 Segue