2014-09-12 12 views
6

stellte ich einen UITableViewController in einem popover auf dem iPad angezeigt werden: UITableViewController inside a popovervon einem UIAlertController Präsentieren innerhalb eines Popover in iOS8

Wenn ich auf eine Reihe klicken, ich zeige eine Warnung dem Benutzer eines potenziellen destruktiven zu warnen Aktion. verwendete ich den neuen UIAlertController, und hier ist, was passiert: UIAlertViewController appears ...

Die popover sehr klein (die Größe der alertController Ansicht in der Tat). Wenn ich auf Abbrechen drücken, kann ich sehen das Ergebnis: ... making the popover shrink!

Hier ist mein Code:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    var previouslySelectedCell: UITableViewCell? 
    if checkedIndexPath != nil { 
     previouslySelectedCell = tableView.cellForRowAtIndexPath(checkedIndexPath) 
    } 
    var selectedCell = tableView.cellForRowAtIndexPath(indexPath) 

    let selectedCurrency = PortfolioCurrencyStore.sharedStore().allCurrencies[indexPath.row] 

    if selectedCurrency.symbol != GlobalSettings.sharedStore().portfolioCurrency { 

     // Warning : changing the portfolio currency will reset the portfolio 
     var resetWarning = UIAlertController(title: NSLocalizedString("Currency Picker VC:AS title", comment: "Changing currency will reset portfolio"), message: nil, preferredStyle: .ActionSheet) 

     // destructive button 
     let resetAction = UIAlertAction(title: NSLocalizedString("Currency Picker VC:AS destructive", comment: "Destructive button title"), style: .Destructive, handler: { (action: UIAlertAction!) in 

      // Remove checkmark from the previously marked cell 
      previouslySelectedCell?.accessoryType = .None 

      // Add checkmark to the selected cell 
      selectedCell?.accessoryType = .Checkmark 
      self.checkedIndexPath = indexPath 

      // Animate deselection of cell 
      self.tableView.deselectRowAtIndexPath(indexPath, animated:true) 

      // Stock the portfolio currency as NSUserDefaults 
      GlobalSettings.sharedStore().portfolioCurrency = selectedCurrency.symbol // link between portfolioCurrency as a String and currency.symbol as the property of a Currency instance. 

      // Delete all items from the StockStore 
      StockStore.sharedStore().removeAllStocks() 
      println("StockStore : all entries were deleted") 


      // Reload tableView 
      self.tableView.reloadData() 

      }) 

     // cancel button 
     let cancelAction = UIAlertAction(title: NSLocalizedString("Currency Picker VC:AS cancel", comment: "Cancel button title"), style: .Cancel, handler:nil) 

     resetWarning.addAction(resetAction) 
     resetWarning.addAction(cancelAction) 

     presentViewController(resetWarning, animated: true, completion: nil) 

    } else { 
     // Animate deselection of cell 
     tableView.deselectRowAtIndexPath(indexPath, animated:true) 
    } 
} 

Habe ich etwas verpasst?

Danke für Ihre Hilfe

+0

Das gleiche Problem hier :-( – Scotty

Antwort

8

Es gefunden! Wenn dieser AlertController in einem Popover dargestellt wird, muss er die Standortinformationen bereitstellen, entweder eine sourceView und sourceRect oder ein barButtonItem.

Wie

resetWarning.popoverPresentationController?.sourceView = selectedCell?.contentView 
resetWarning.popoverPresentationController?.sourceRect = selectedCell!.contentView.frame 

Mein Code so aussehen hatte:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    var previouslySelectedCell: UITableViewCell? 
    if checkedIndexPath != nil { 
     previouslySelectedCell = tableView.cellForRowAtIndexPath(checkedIndexPath) 
    } 
    var selectedCell = tableView.cellForRowAtIndexPath(indexPath) 

    let selectedCurrency = PortfolioCurrencyStore.sharedStore.allCurrencies[indexPath.row] 

    if selectedCurrency.symbol != GlobalSettings.sharedStore.portfolioCurrency { 

     // Warning : changing the portfolio currency will reset the portfolio 
     var resetWarning = UIAlertController(title: NSLocalizedString("Currency Picker VC:AS title", comment: "Changing currency will reset portfolio"), message: nil, preferredStyle: .ActionSheet) 

     // destructive button 
     let resetAction = UIAlertAction(title: NSLocalizedString("Currency Picker VC:AS destructive", comment: "Destructive button title"), style: .Destructive, handler: { (action: UIAlertAction!) in 

      // Remove checkmark from the previously marked cell 
      previouslySelectedCell?.accessoryType = .None 

      // Add checkmark to the selected cell 
      selectedCell?.accessoryType = .Checkmark 
      self.checkedIndexPath = indexPath 

      // Animate deselection of cell 
      self.tableView.deselectRowAtIndexPath(indexPath, animated:true) 

      // Stock the portfolio currency as NSUserDefaults 
      GlobalSettings.sharedStore.portfolioCurrency = selectedCurrency.symbol // link between portfolioCurrency as a String and currency.symbol as the property of a Currency instance. 

      // Delete all items from the StockStore 
      StockStore.sharedStore.removeAllStocks() 
      println("StockStore : all entries were deleted") 

      // Delete all items from the CurrencyRateStore 
      CurrencyRateStore.sharedStore.deleteAllRates() 
      println("CurrencyStore : all entries were deleted") 

      // Delete all items from the SalesJournal 
      SalesJournal.sharedStore.removeAllEntries() 
      println("SalesJournal : all Sales journal entries were deleted") 


      // Reload tableView 
      self.tableView.reloadData() 

      // On Regular sizes, the currency picker is presented inside a popover : reloadData of the List View 
      NSNotificationCenter.defaultCenter().postNotificationName("CurrencyPickerVC_PortfolioCurrencyDidChangeNotification", object:nil, userInfo:nil) 

      // Animate deselection of cell 
      tableView.deselectRowAtIndexPath(indexPath, animated:true) 

      // Return to root VC 
      self.navigationController?.popToRootViewControllerAnimated(true) 

      }) 



     // cancel button 
     let cancelAction = UIAlertAction(title: NSLocalizedString("Currency Picker VC:AS cancel", comment: "Cancel button title"), style: .Cancel, handler: { (alertAction: UIAlertAction!) -> Void in 
      // Animate deselection of cell 
      self.tableView.deselectRowAtIndexPath(indexPath, animated:true) 
     }) 

     resetWarning.addAction(resetAction) 
     resetWarning.addAction(cancelAction) 

     // If this AlertController is presented inside a popover, it must provide the location information, either a sourceView and sourceRect or a barButtonItem. 
     resetWarning.popoverPresentationController?.sourceView = selectedCell?.contentView 
     resetWarning.popoverPresentationController?.sourceRect = selectedCell!.contentView.frame 

     presentViewController(resetWarning, animated: true, completion: nil) 


    } else { 
     // Animate deselection of cell 
     tableView.deselectRowAtIndexPath(indexPath, animated:true) 
    } 
} 

nun das Bild sieht wie folgt aus: enter image description here

4

Ich hatte das gleiche Problem und war, um herauszufinden, nicht in der Lage, wie die popover zu verhindern, dass die Größenänderung. Wenn Sie eine Warnmeldung anstelle eines Aktionsblatts verwenden, wird auch die Größe des Popover geändert. Die Problemumgehung, die ich fand, bestand darin, ein Action Sheet als Popover selbst zu verwenden, indem Sie den Modal Presentation Style auf UIModalPresentationPopover setzen. Ich weiß, dass Sie Swift verwenden, aber mein Code ist Objective-C; hoffentlich wird es Ihnen leicht, zu übersetzen:

- (UIAlertController *)modalAlertWithTitle:(NSString *)title andMessage:(NSString *)message fromViewController:(UIViewController *)sender { 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleActionSheet]; 

    // This will turn the Action Sheet into a popover 
    [alertController setModalPresentationStyle:UIModalPresentationPopover]; 

    // Set Modal In Popover to YES to make sure your popover isn't dismissed by taps outside the popover controller 
    [alertController setModalInPopover:YES]; 

    // Get the PopoverPresentationController and set the source View and Rect so the Action Sheet knows where to pop up 
    UIPopoverPresentationController *popPresenter = [alertController popoverPresentationController]; 
    popPresenter.sourceView = sender.view; 
    popPresenter.sourceRect = sender.view.bounds; 

    return alertController; 
} 

Es ist sehr wichtig, dass Sie festlegen, erinnern sich an Ihre Schaltfläche UIAlertAction Stil auf Standard abzubrechen. Wenn Sie den Stil auf Abbrechen setzen, wird er nicht im Aktionsblatt angezeigt, da hier ein ModalPresentationPopover verwendet wird. Benutzer können auch nicht abbrechen, indem Sie außerhalb des Aktionsblatts auf tippen, da wir ModalInPopover auf YES gesetzt haben. Wenn Sie den Stil der Abbrechen-Schaltfläche auf "Standard" einstellen, wird sichergestellt, dass sie auf dem Blatt angezeigt wird.

Ich habe dies nur als eine Hilfsmethode in meinem AppDelegate gemacht, so dass ich es aus allen meinen Popovers aufrufen konnte. Dies funktioniert, ist aber nicht wirklich eine ideale Lösung, denn wenn etwas ausgelöst wird, während eines deiner Popovers aktiv ist, kann sich die Größe ändern. Bitte lassen Sie es mich wissen, wenn Sie herausfinden, wie Sie die Größenänderung überhaupt verhindern können. Viel Glück!