スウィフトのdeinitは呼び出されません

BartłomiejSemańczyk
private let DBItemCellIdentifier = "ItemCellIdentifier"
private let DBItemSegueIdentifier = "ItemSegueIdentifier"

class DBItemsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DBItemTableViewCellDelegate {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var previousButton: UIButton!
    @IBOutlet weak var nextButton: UIButton!
    @IBOutlet weak var categoryNameLabel: UILabel!

    private var elements = [Any]()
    private var currentItemIndex = 0
    private var isFetching = false

    private weak var currentCategory: DBCategory? {

        didSet {
            updateView()
        }
    }

    var categories = [DBCategory]()
    var currentCategoryIndex = 0

    //MARK: - Class Methods

    //MARK: - Initialization

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 100.0
        tableView.tableFooterView = UIView(frame: CGRectZero)

        setupUserAndCartButtons()
        fetchItems()
    }

    deinit {
        print("deinit")
    }

    //MARK: - Actions

    @IBAction func nextButtonTapped(sender: UIButton) {

        currentCategoryIndex = min(currentCategoryIndex + 1, categories.count - 1)
        fetchItems()
    }

    @IBAction func previousButtonTapped(sender: UIButton) {

        currentCategoryIndex = max(currentCategoryIndex - 1, 0)
        fetchItems()
    }

    //MARK: - Private

    private func fetchItems() {

        tableView.alpha = 0
        currentCategory = nil

        if !categories.isEmpty && !isFetching {
            let category = categories[currentCategoryIndex]
            currentCategory = DBCategory.findCategoryWithIdentifier(category.identifier)

            if currentCategory == nil {
                SVProgressHUD.show()
            }

            isFetching = true

            DBNetworkClient.sharedClient().itemsForCategory(category, completionBlock: { error in

                defer {
                    self.isFetching = false
                    SVProgressHUD.dismiss()
                    UIAlertController.showAlertFromError(error)
                }

                self.currentCategory = DBCategory.findCategoryWithIdentifier(category.identifier)
            })
        }
    }

    private func updateView() {

        let category = categories[currentCategoryIndex]
        title = category.menu.location.name

        categoryNameLabel.text = category.name
        previousButton.hidden = currentCategoryIndex == 0 ? true : false
        nextButton.hidden = currentCategoryIndex == categories.count - 1 ? true : false

        prepareElements()

        tableView.reloadData()

        UIView.animateWithDuration(0.5, animations: {
            self.tableView.alpha = 1
        })
    }

    private func prepareElements() {

        elements.removeAll(keepCapacity: false)

        if let items = currentCategory?.items {
            for item in items {
                elements.append(item)
            }
        }

        if let sets = currentCategory?.sets {
            for set in sets {
                elements.append(set)
            }
        }

        elements.sortInPlace {

            let left = ($0 as? DBSet)?.position ?? ($0 as? DBItem)?.position
            let right = ($1 as? DBSet)?.position ?? ($1 as? DBItem)?.position

            return left < right
        }
    }

    //MARK: - Overridden

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

        let element = elements[currentItemIndex]

        if segue.identifier == DBItemSegueIdentifier {
            let itemViewController = segue.destinationViewController as! DBItemViewController
            itemViewController.prepareWithElement(element)

        }
    }

    //MARK: - UITableViewDataSource

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0 //when I change to elements.count, deinit is not called
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier(DBItemCellIdentifier, forIndexPath: indexPath) as! DBItemTableViewCell
        let element = elements[indexPath.row]

        if let item = element as? DBItem {
            cell.configureCellWithItem(item)
        } else if let set = element as? DBSet {
            cell.configureCellWithSet(set)
        }

        cell.delegate = self

        return cell
    }

    //MARK: - UITableViewDelegate

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

        currentItemIndex = indexPath.row
        performSegueWithIdentifier(DBItemSegueIdentifier, sender: tableView.cellForRowAtIndexPath(indexPath))
    }

    //MARK: - DBItemTableViewCellDelegate

    func itemTableViewCell(cell: DBItemTableViewCell, willPresentSetGroupsViewControllerForSet set: DBSet) {
        presentSetOrderControllerWithOrder(DBSetOrder(set: set))
    }

    func itemTableViewCell(cell: DBItemTableViewCell, willPresentItemMealSizesViewControllerForItem item: DBItem) {
        presentItemOrderControllerWithOrder(DBItemOrder(item: item))
    }
}

なぜ私deinitは呼ばれないのですこれが100できるようになったら賞金を提供し、この問題の解決を手伝ってくれた人に賞金を授与します...問題を解決した後も賞金を提供します。

非常に重要な情報:このコードはを呼び出します deinitそれは機能しています。行数が0なので。でも必要elements.countです。これに変更すると、deinit呼び出されません。

編集:

func itemsForCategory(category: DBCategory, completionBlock: DBErrorHandler) {

    let query = "locations/" + category.menu.location.identifier + "/categories/" + category.identifier

    GET(query, parameters: nil, success: { operation, response in

        if let error = NSError(response: response) {
            completionBlock(error)
        } else {
            self.coreDataAssistant.parseAndSaveItemsToPersistentStore(response as? NSDictionary, completionBlock: { error in
                completionBlock(error)
            })
        }

        }) { operation, error in

            let responseError = NSError(response: operation.responseObject)
            completionBlock(responseError ?? error)
    }
}
スティーブウィルフォード

selfテーブルビューセルのデリゲートとして割り当てています。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(DBItemCellIdentifier, forIndexPath: indexPath) as! DBItemTableViewCell
    let element = elements[indexPath.row]

    if let item = element as? DBItem {
        cell.configureCellWithItem(item)
    } else if let set = element as? DBSet {
        cell.configureCellWithSet(set)
    }

    // HERE
    cell.delegate = self

    return cell
}

セルのデリゲートプロパティは次のように定義されています。

var delegate: DBItemTableViewCellDelegate?

これにより、セルとデリゲート(ビューコントローラー)の間に強力な参照が作成されます。セルはテーブルビューでも保持されます。これにより、保持サイクルが作成されます。

デリゲートプロパティの定義を次のように変更する必要がありますweak

weak var delegate: DBItemTableViewCellDelegate?

コメントに基づいて編集

あなたのDBItemTableViewCellDelegate定義は、次のように定義する必要がありますクラス専用プロトコル

protocol DBItemTableViewCellDelegate: class { 
    ...
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

DeinitはUIViewControllerで呼び出されませんが、Deallocは呼び出されます

分類Dev

スウィフト 3 ストライドは呼び出せません

分類Dev

デフォルトのRequestMappingは呼び出されません

分類Dev

SearchControllerを使用したTableView-DEINITは呼び出されません

分類Dev

テーブルビューdeinitは呼び出されません

分類Dev

プライベート関数didFinishLaunchingWithOptionsが呼び出されていませんか?(スウィフト3)

分類Dev

FlutteronChangedはウィジェットに対して呼び出されません

分類Dev

nestjs例外フィルターは呼び出されません

分類Dev

非関数型の値を呼び出すことはできません '((AnyObject)-> AnyObject?)!' -スウィフト3

分類Dev

フェッチ呼び出しのスタブ-response.jsonは呼び出されません

分類Dev

フラグメントのOnActivityResultは呼び出されません

分類Dev

直接呼び出されるフィクスチャ「setUp」。備品は直接呼び出すことを意図したものではありません

分類Dev

直接呼び出されるフィクスチャ「setUp」。備品は直接呼び出すことを意図したものではありません

分類Dev

再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

分類Dev

ServiceStack- [Authenticate]属性は、リクエストフィルターの前に呼び出されます。OrmLiteMultitenancyAuthRepository / OrmLiteCacheClientでは機能しません

分類Dev

デストラクタは呼び出されませんか?

分類Dev

C ++デストラクタは呼び出されません

分類Dev

ビューコントローラーを閉じるときに、アプリでdeinitが呼び出されましたが、単体テストでは呼び出されません

分類Dev

トランスデューサーのinitは呼び出されません

分類Dev

NSObjectクラスのデリゲートは呼び出されません

分類Dev

入力フィールドがない場合、キーダウンは呼び出されません

分類Dev

PreviewMouseLeftButtonUpイベントは、マウスがクリックされたときに呼び出されません

分類Dev

Swift Arrayでフィルターを使用すると、「タイプ(Object)の引数リストでフィルターを呼び出すことはできません。throws-> Bool」が返されますが、引数はスローされません。

分類Dev

onRequestPermissionsResultは、非アクティビティおよび非フラグメントクラスでは呼び出されません

分類Dev

Jest-モックされた関数の呼び出しはカウントされません

分類Dev

onClickは拡張レイアウトでは呼び出されません

分類Dev

Angular6のネストされたHTTP呼び出しネストされた呼び出しは実行されません

分類Dev

SetConsoleCtrlHandlerはシャットダウン時に呼び出されません

分類Dev

onTouch() は親レイアウトに対して呼び出されません

Related 関連記事

  1. 1

    DeinitはUIViewControllerで呼び出されませんが、Deallocは呼び出されます

  2. 2

    スウィフト 3 ストライドは呼び出せません

  3. 3

    デフォルトのRequestMappingは呼び出されません

  4. 4

    SearchControllerを使用したTableView-DEINITは呼び出されません

  5. 5

    テーブルビューdeinitは呼び出されません

  6. 6

    プライベート関数didFinishLaunchingWithOptionsが呼び出されていませんか?(スウィフト3)

  7. 7

    FlutteronChangedはウィジェットに対して呼び出されません

  8. 8

    nestjs例外フィルターは呼び出されません

  9. 9

    非関数型の値を呼び出すことはできません '((AnyObject)-> AnyObject?)!' -スウィフト3

  10. 10

    フェッチ呼び出しのスタブ-response.jsonは呼び出されません

  11. 11

    フラグメントのOnActivityResultは呼び出されません

  12. 12

    直接呼び出されるフィクスチャ「setUp」。備品は直接呼び出すことを意図したものではありません

  13. 13

    直接呼び出されるフィクスチャ「setUp」。備品は直接呼び出すことを意図したものではありません

  14. 14

    再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

  15. 15

    ServiceStack- [Authenticate]属性は、リクエストフィルターの前に呼び出されます。OrmLiteMultitenancyAuthRepository / OrmLiteCacheClientでは機能しません

  16. 16

    デストラクタは呼び出されませんか?

  17. 17

    C ++デストラクタは呼び出されません

  18. 18

    ビューコントローラーを閉じるときに、アプリでdeinitが呼び出されましたが、単体テストでは呼び出されません

  19. 19

    トランスデューサーのinitは呼び出されません

  20. 20

    NSObjectクラスのデリゲートは呼び出されません

  21. 21

    入力フィールドがない場合、キーダウンは呼び出されません

  22. 22

    PreviewMouseLeftButtonUpイベントは、マウスがクリックされたときに呼び出されません

  23. 23

    Swift Arrayでフィルターを使用すると、「タイプ(Object)の引数リストでフィルターを呼び出すことはできません。throws-> Bool」が返されますが、引数はスローされません。

  24. 24

    onRequestPermissionsResultは、非アクティビティおよび非フラグメントクラスでは呼び出されません

  25. 25

    Jest-モックされた関数の呼び出しはカウントされません

  26. 26

    onClickは拡張レイアウトでは呼び出されません

  27. 27

    Angular6のネストされたHTTP呼び出しネストされた呼び出しは実行されません

  28. 28

    SetConsoleCtrlHandlerはシャットダウン時に呼び出されません

  29. 29

    onTouch() は親レイアウトに対して呼び出されません

ホットタグ

アーカイブ