রান টাইমে আমি কীভাবে সীমাবদ্ধতার অগ্রাধিকার পরিবর্তন করতে পারি


87

আমার একটি দৃশ্যের গতিশীল উচ্চতা রয়েছে এবং আমি রান সময়টিতে এই দর্শন উচ্চতার অগ্রাধিকারটি পরিবর্তন করার চেষ্টা করছি।

আমার কোডের অংশটি এখানে;

if (index == 0) {

    surveyViewHeightConstraint.constant = 0;
    surveyViewHeightConstraint.priority = 1000;

} else if (index == 1) {

    surveyViewHeightConstraint.constant = 163;
    surveyViewHeightConstraint.priority = 500;

}

আমি একটি বোতাম ক্রিয়া সহ সূচি পরিবর্তন করছি। আমি এই কোডটি চালানোর সময়, আমি এই ত্রুটিটি পাচ্ছি:

*** Assertion failure in -[NSLayoutConstraint setPriority:], /SourceCache/Foundation/Foundation-1141.1/Layout.subproj/NSLayoutConstraint.m:174

এখানে আমার ভুল কী?

উত্তর:


174

NSLayoutConstraintশ্রেণি রেফারেন্স হিসাবে বলা হয়েছে :

অগ্রাধিকারগুলি অপ্রয়োজনীয় থেকে প্রয়োজনীয়, বা প্রয়োজনীয় থেকে অপরিবর্তিত হতে পারে না। NSLayoutPriorityRequiredওএস এক্স বা UILayoutPriorityRequiredআইওএস-এর কোনও অগ্রাধিকারকে নিম্ন অগ্রাধিকারে পরিবর্তন করা হলে বা কোনও দৃশ্যে বাধা যুক্ত হওয়ার পরে যদি একটি নিম্ন অগ্রাধিকার প্রয়োজনীয় অগ্রাধিকারে পরিবর্তন করা হয় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে । দৃশ্যে সীমাবদ্ধতা ইনস্টল হওয়ার পরেও এক oneচ্ছিক অগ্রাধিকার থেকে অন্য alচ্ছিক অগ্রাধিকারে পরিবর্তন অনুমোদিত।

অগ্রাধিকারটি 1000 এর পরিবর্তে 999 ব্যবহার করুন techn এটি প্রযুক্তিগতভাবে বলতে গেলে একেবারেই প্রয়োজন হবে না তবে এটি অন্য যে কোনও কিছুর চেয়ে উচ্চতর অগ্রাধিকার হবেন।


4
আপনার উত্তরের উত্তরের জন্য ধন্যবাদ, তবে আমি যদি 1000 এর পরিবর্তে 999 ব্যবহার করি তবে আমি 0 টি উচ্চতার সীমাবদ্ধ করে আমার দৃষ্টিভঙ্গিটি আড়াল করতে পারি না।
লে'কিরডোক

এটা অন্য সমস্যা। আপনার অন্যান্য বিরোধপূর্ণ বাধা থাকতে পারে। যদি আপনার কোডটি আর ক্রাশ না হয় তবে আপনার ভিউ অ্যানিমেশনটি এখনও ভুল রয়েছে, দয়া করে এই প্রশ্নটিকে সমাধান হিসাবে চিহ্নিত করুন; তারপরে অন্য একটি খুলুন।
সাইরিল

সুন্দর একটি, এটি বিভিন্ন মান (999, 900, 500, ইত্যাদি) ব্যবহার করতে সমস্যা নয় :)
ব্যবহারকারী 924

7
সিরিয়াসলি? আইওএস বিকাশে সাধারণভাবে কিছু কাজ করছে? সিস্টেম বাগ বা অসমর্থিততার জন্য অনেকগুলি কাজ ম্যানুয়ালি করতে হয়েছিল এবং / অথবা প্রচুর পরিমাণে কোড কোড প্রয়োগ করতে হয়েছিল। গঠনমূলক মন্তব্য না করার জন্য দুঃখিত।
Luten

7
এটি দেখে মনে হচ্ছে এই সীমাবদ্ধতা আইওএস 13. আমি সরানো হয়েছে থেকে একটি বাধ্যতা পরিবর্তন চেষ্টা requiredকরতে defaultLowএবং এটা কাজ করে। একই কোডটি আইওএস 12 এ ক্র্যাশ করতে ব্যবহৃত হয়েছিল
স্টিভেন ভান্ডেভেহে

53

আমি সিরিলের উত্তরে একটি ছোট সংযোজন করতে চাই।

আপনি যদি কোডটিতে সীমাবদ্ধতা তৈরি করে থাকেন তবে এটিকে সক্রিয় করার আগে এর অগ্রাধিকারটি সেট করে নিন তা নিশ্চিত করুন। এই ক্ষেত্রে:

surveyViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self
                                               attribute:NSLayoutAttributeHeight
                                               relatedBy:NSLayoutRelationEqual
                                                  toItem:self.superview
                                               attribute:NSLayoutAttributeHeight
                                              multiplier:1
                                                constant:0];
surveyViewHeightConstraint.active = YES;
surveyViewHeightConstraint.priority = 999;

এটি রান-টাইম ব্যতিক্রম হতে পারে।

কোনও ইনস্টলড সীমাবদ্ধতার (বা তদ্বিপরীত) না হওয়া থেকে প্রয়োজনীয় থেকে অগ্রাধিকারকে রূপান্তরিত করা সমর্থনযোগ্য নয়।

সঠিক অর্ডারটি হ'ল:

surveyViewHeightConstraint.priority = 999;
surveyViewHeightConstraint.active = YES;

সুইফ্ট সংস্করণ 4+ এর জন্য

constraintName.priority = UILayoutPriority(rawValue: 999)


8

আমরা যেভাবে সর্বদা এটি পরিচালনা করেছি তা হ'ল সীমাবদ্ধতার ধ্রুবকটি পরিবর্তন না করে কেবল অগ্রাধিকার। উদাহরণস্বরূপ, আপনার পরিস্থিতিতে দুটি উচ্চতার প্রতিবন্ধকতা রয়েছে।

 heightConstraintOne (who's height is set in the storyboard at 150, and priority set at 750)
 heightConstraintTwo (who's height is set in the storyboard at 0, and priority set at 250)

আপনি যদি ভিউটি আড়াল করতে চান তবে আপনি:

heightConstraintTwo.priority = 999;

তেমনিভাবে, আপনি যদি ভিউটি দেখাতে চান:

heightConstraintTwo.priority = 250;

4
শীতল, এটি পেয়েছে: 1000 এর পরিবর্তে 999 ব্যবহার করুন Thanks ধন্যবাদ
ব্রেইনারে

3

আমি আশা করি এই দৃশ্যটি কাউকে সাহায্য করবে: আমার দুটি বাধা ছিল যে তারা একে অপরের বিপরীতে ছিল, আমি বলতে চাইছি তারা একই সময়ে সন্তুষ্ট হতে পারে না, ইন্টারফেস বিল্ডারে তাদের একটির 1000 টির অগ্রাধিকার ছিল এবং অন্যটির 1000 টিরও কম অগ্রাধিকার ছিল। যখন আমি কোডগুলিতে তাদের পরিবর্তন করেছি, তখন আমার এই ত্রুটি ছিল:

অপ্রয়োজনীয় ব্যতিক্রম 'NSInternInconsistencyException' কারণে অ্যাপ্লিকেশন সমাপ্তি, কারণ: 'একটি ইনস্টলড বাধা (বা তদ্বিপরীত) না করা প্রয়োজন থেকে একটি অগ্রাধিকার রূপান্তর সমর্থিত নয়। আপনি অগ্রাধিকার 250 পেরিয়েছেন এবং বিদ্যমান অগ্রাধিকারটি ছিল 1000. '

তারপরে আমি কেবলমাত্র .defaultHigh এবং .defaultLow মানগুলির সাথে ViewDidLoad ফাংশনটিতে তাদের আরম্ভ করেছিলাম এবং এটি আমার সমস্যাটিকে স্থির করে।


1

NSLayoutConstraints classভিতরে অনুযায়ীUIKit Module

যদি সীমাবদ্ধতার অগ্রাধিকার স্তরটি ইউআইএলআউটপ্রাইটিটির প্রয়োজনীয়তা থেকে কম হয়, তবে এটি alচ্ছিক। নিম্ন অগ্রাধিকারের সীমাবদ্ধতার আগে উচ্চতর অগ্রাধিকারের সীমাবদ্ধতাগুলি পূরণ করা হয়। বাধা সন্তুষ্টি সব বা কিছুই না। যদি 'a == b' সীমাবদ্ধতা alচ্ছিক হয়, তার অর্থ আমরা 'অ্যাবস (অ্যাব)' হ্রাস করার চেষ্টা করব। এই সম্পত্তিটি কেবলমাত্র প্রাথমিক সেট আপের অংশ হিসাবে বা whenচ্ছিকভাবে পরিবর্তিত হতে পারে। একটি দৃশ্যে একটি প্রতিবন্ধকতা যুক্ত হওয়ার পরে, অগ্রাধিকারটি NSLayoutPriorityRequired থেকে / এ পরিবর্তন করা হলে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

উদাহরণ: - UIButtonবিভিন্ন অগ্রাধিকার সহিত বাধা -

 func setConstraints() {
        buttonMessage.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint(item: buttonMessage, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: -10).isActive = true

        let leading = NSLayoutConstraint(item: buttonMessage, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 10)

        leading.isActive = true


        let widthConstraint = NSLayoutConstraint(item: buttonMessage, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

        let heightConstraint = NSLayoutConstraint(item: buttonMessage, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 50)


        let trailingToSuperView = NSLayoutConstraint(item: buttonMessage, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0)

        trailingToSuperView.priority = 999
        trailingToSuperView.isActive = true

        //leading.isActive = false//uncomment & check it will align to right of the View

        buttonMessage.addConstraints([widthConstraint,heightConstraint])

         }  

4
না, আপনার কখনও বাধা সৃষ্টি করা উচিত নয় viewDidLayoutSubviews। এই পদ্ধতিটি বেশ কয়েকবার কল করা যেতে পারে, আপনি যদি সেখানে সদৃশ সীমাবদ্ধতা তৈরি করেন তবে এটি আপনার অ্যাপ্লিকেশনটিকে ক্রাশ করতে পারে।
মাইল

0

আমি একই সমস্যা ছিল। যেমন আইওএস ১৩-এ উল্লিখিত কিছু উত্তর অগ্রাধিকার অগ্রাধিকার ঠিকঠাক করবে, তবে আইওএস 12 এ এটি ক্রাশের দিকে নিয়ে যাবে।

স্টোরিবোর্ডের নির্দিষ্ট সীমাবদ্ধতার জন্য আইবিআউটলেট এনএসলায়আউটকন্ট্রেন্ট তৈরি করে আমি এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি 1000 এর অগ্রাধিকার বজায় রেখে, নীচে ঠিক করার কোডটি।

if (Condition) {
    surveyViewHeightConstraint.constant = 0;
    surveyViewHeightConstraint.isActive = false;
} else if (index == 1) {
    surveyViewHeightConstraint.constant = 163;
    surveyViewHeightConstraint.isActive = True;
}

আশাকরি এটা সাহায্য করবে!!! চিয়ার্স


-2

এখন আপনি নিজের সীমাবদ্ধতার জন্য কেবল আইবিআউটলেট সংযোগ নিতে পারেন, তারপরে এই কোডটি ব্যবহার করুন।

self.webviewHeight.priority = UILayoutPriority(rawValue: 1000)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.