কীভাবে ইউআইভিউএলারিটফর ইউন্যাসিটাইফিয়েবল কনট্রেনট্রে ট্র্যাপ করবেন?


234

আমি আমার ডিবাগার লগে একটি ত্রুটি উপস্থিত দেখছি:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x191f0920 H:[MPKnockoutButton:0x17a876b0]-(34)-[MPDetailSlider:0x17a8bc50](LTR)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

আমি কিভাবে এই কল আটকাতে পারি? এটি আমার কোডের কোথাও উপস্থিত হয় না।

Screenshot1


10 টির মধ্যে 9 টিতে: এটি কেবল এর কারণে ঘটেছিল: ইওরো স্টোরিবোর্ডে কিছু দর্শন বা আইটেমের জন্য, আপনি "ইনস্টলড "টিকে চেক করেন না। (উদাহরণস্বরূপ, কেবলমাত্র একটি উন্নয়নের বোতাম বা আপনার আর কোনও প্রয়োজন নেই)) সাধারণভাবে, এটি "ইনস্টল করা নয়" খারাপভাবে পরিচালনা করে: এটি প্রায়শই এমন প্রতিবন্ধকতা ফেলে দেয় যা ইনস্টলড নয় এমন আইটেম ব্যতীত অর্থহীন হয়ে পড়ে। প্রায়শই সমাধানটি হ'ল আপনি যে আইটেমগুলি সম্পর্কে ভুলে গেছেন তা মুছে ফেলা হয়, যেগুলি "ইনস্টল করা নয়" এর আশেপাশে বসে থাকে - কেবল তাদের ইমেল মুছুন।
ফ্যাটি

উত্তর:


442

এই পোস্টে আমাকে সাহায্য একটি অনেক !

আমি প্রস্তাবিত ক্রিয়াকলাপের সাথে ইউআইভিউএলার্টফরউস্যান্টসাইফিয়েবল কনট্রেন্টসকে প্রতীকী ব্রেকআপপয়েন্ট যুক্ত করেছি :

ওবজে-সি প্রকল্প

po [[UIWindow keyWindow] _autolayoutTrace]

উদ্দেশ্য-সি প্রকল্পে কাস্টম অ্যাকশন সহ সিম্বলিক ব্রেকপয়েন্ট

সুইফ্ট প্রকল্প

expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]

কাস্টম অ্যাকশনের সাথে প্রতীক ব্রেক break

এই ইঙ্গিতটির সাহায্যে লগটি আরও বিশদ আকার ধারণ করে এবং কোন দৃশ্যের সীমাবদ্ধতা ভঙ্গ হয়েছিল তা সনাক্ত করা আমার পক্ষে সহজ।

UIWindow:0x7f88a8e4a4a0
|   UILayoutContainerView:0x7f88a8f23b70
|   |   UINavigationTransitionView:0x7f88a8ca1970
|   |   |   UIViewControllerWrapperView:0x7f88a8f2aab0
|   |   |   |   UIView:0x7f88a8ca2880
|   |   |   |   |   *UIView:0x7f88a8ca2a10
|   |   |   |   |   |   *UIButton:0x7f88a8c98820'Archived'
|   |   |   |   |   |   |   UIButtonLabel:0x7f88a8cb0e30'Archived'
|   |   |   |   |   |   *UIButton:0x7f88a8ca22d0'Download'
|   |   |   |   |   |   |   UIButtonLabel:0x7f88a8cb04e0'Download'
|   |   |   |   |   |   *UIButton:0x7f88a8ca1580'Deleted'
|   |   |   |   |   |   |   UIButtonLabel:0x7f88a8caf100'Deleted'
|   |   |   |   |   *UIView:0x7f88a8ca33e0
|   |   |   |   |   *_UILayoutGuide:0x7f88a8ca35b0
|   |   |   |   |   *_UILayoutGuide:0x7f88a8ca4090
|   |   |   |   |   _UIPageViewControllerContentView:0x7f88a8f1a390
|   |   |   |   |   |   _UIQueuingScrollView:0x7f88aa031c00
|   |   |   |   |   |   |   UIView:0x7f88a8f38070
|   |   |   |   |   |   |   UIView:0x7f88a8f381e0
|   |   |   |   |   |   |   |   UIView:0x7f88a8f39fa0, MISSING HOST CONSTRAINTS
|   |   |   |   |   |   |   |   |   *UIButton:0x7f88a8cb9bf0'Retrieve data'- AMBIGUOUS LAYOUT for UIButton:0x7f88a8cb9bf0'Retrieve data'.minX{id: 170}, UIButton:0x7f88a8cb9bf0'Retrieve data'.minY{id: 171}
|   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8f3ad80- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8f3ad80.minX{id: 172}, UIImageView:0x7f88a8f3ad80.minY{id: 173}
|   |   |   |   |   |   |   |   |   *App.RecordInfoView:0x7f88a8cbe530- AMBIGUOUS LAYOUT for App.RecordInfoView:0x7f88a8cbe530.minX{id: 174}, App.RecordInfoView:0x7f88a8cbe530.minY{id: 175}, App.RecordInfoView:0x7f88a8cbe530.Width{id: 176}, App.RecordInfoView:0x7f88a8cbe530.Height{id: 177}
|   |   |   |   |   |   |   |   |   |   +UIView:0x7f88a8cc1d30- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc1d30.minX{id: 178}, UIView:0x7f88a8cc1d30.minY{id: 179}, UIView:0x7f88a8cc1d30.Width{id: 180}, UIView:0x7f88a8cc1d30.Height{id: 181}
|   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8cc1ec0- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc1ec0.minX{id: 153}, UIView:0x7f88a8cc1ec0.minY{id: 151}, UIView:0x7f88a8cc1ec0.Width{id: 154}, UIView:0x7f88a8cc1ec0.Height{id: 165}
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8e68e10- AMBIGUOUS LAYOUT for UIView:0x7f88a8e68e10.minX{id: 155}, UIView:0x7f88a8e68e10.minY{id: 150}, UIView:0x7f88a8e68e10.Width{id: 156}
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e65de0- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8e65de0.minX{id: 159}, UIImageView:0x7f88a8e65de0.minY{id: 182}
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8e69080'8-6-2015'- AMBIGUOUS LAYOUT for UILabel:0x7f88a8e69080'8-6-2015'.minX{id: 183}, UILabel:0x7f88a8e69080'8-6-2015'.minY{id: 184}, UILabel:0x7f88a8e69080'8-6-2015'.Width{id: 185}
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc0690'16:34'- AMBIGUOUS LAYOUT for UILabel:0x7f88a8cc0690'16:34'.minX{id: 186}, UILabel:0x7f88a8cc0690'16:34'.minY{id: 187}, UILabel:0x7f88a8cc0690'16:34'.Width{id: 188}, UILabel:0x7f88a8cc0690'16:34'.Height{id: 189}
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8cc2050- AMBIGUOUS LAYOUT for UIView:0x7f88a8cc2050.minX{id: 161}, UIView:0x7f88a8cc2050.minY{id: 166}, UIView:0x7f88a8cc2050.Width{id: 163}
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e69d90- AMBIGUOUS LAYOUT for UIImageView:0x7f88a8e69d90.minX{id: 190}, UIImageView:0x7f88a8e69d90.minY{id: 191}, UIImageView:0x7f88a8e69d90.Width{id: 192}, UIImageView:0x7f88a8e69d90.Height{id: 193}
|   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3cc00
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8e618d0
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e5ba10
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3cd70
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e58e10
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e5e7a0
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3cee0
|   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3dc70
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8e64dd0
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8e65290'Average flow rate'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8e712d0'177.0 ml/s'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8c97150'1299.4'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3dde0
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3df50'Maximum flow rate'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cbfdb0'371.6 ml/s'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc0230'873.5'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3e2a0
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3e410'Total volume'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc0f20'371.6 ml'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3e870
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3ea00'Time do max. flow'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc0ac0'3.6 s'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3ee10
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3efa0'Flow time'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cbf980'2.1 s'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3f3e0
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3f570'Voiding time'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc17e0'3.5 s'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3f9a0
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8f3fb30'Voiding delay'
|   |   |   |   |   |   |   |   |   |   |   |   *UILabel:0x7f88a8cc1380'1.0 s'
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8e65000
|   |   |   |   |   |   |   |   |   |   |   |   *UIButton:0x7f88a8e52f20'Show'
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e6e1d0
|   |   |   |   |   |   |   |   |   |   |   |   *UIButton:0x7f88a8e52c90'Send'
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e61bb0
|   |   |   |   |   |   |   |   |   |   |   |   *UIButton:0x7f88a8e528e0'Delete'
|   |   |   |   |   |   |   |   |   |   |   |   *UIImageView:0x7f88a8e6b3f0
|   |   |   |   |   |   |   |   |   |   |   |   *UIView:0x7f88a8f3ff60
|   |   |   |   |   |   |   |   |   *UIActivityIndicatorView:0x7f88a8cba080
|   |   |   |   |   |   |   |   |   |   UIImageView:0x7f88a8cba700
|   |   |   |   |   |   |   |   |   *_UILayoutGuide:0x7f88a8cc3150
|   |   |   |   |   |   |   |   |   *_UILayoutGuide:0x7f88a8cc3b10
|   |   |   |   |   |   |   UIView:0x7f88a8f339c0
|   |   UINavigationBar:0x7f88a8c96810
|   |   |   _UINavigationBarBackground:0x7f88a8e45c00
|   |   |   |   UIImageView:0x7f88a8e46410
|   |   |   UINavigationItemView:0x7f88a8c97520'App'
|   |   |   |   UILabel:0x7f88a8c97cc0'App'
|   |   |   UINavigationButton:0x7f88a8e3e850
|   |   |   |   UIImageView:0x7f88a8e445b0
|   |   |   _UINavigationBarBackIndicatorView:0x7f88a8f2b530

Legend:
    * - is laid out with auto layout
    + - is laid out manually, but is represented in the layout engine because translatesAutoresizingMaskIntoConstraints = YES
     - layout engine host

তারপরে আমি মৃত্যুদণ্ড থামিয়ে বিরতি দিয়েছি এবং কমান্ডটি দিয়ে সমস্যাযুক্ত ভিউটির পটভূমির রঙ পরিবর্তন করেছি ( অবশ্যই আপনার অবজেক্টের0x7f88a8cc2050 মেমরি ঠিকানার পরিবর্তে ) ...

OBJ-সি

expr ((UIView *)0x7f88a8cc2050).backgroundColor = [UIColor redColor]

সুইফট 3.0

expr -l Swift -- import UIKit
expr -l Swift -- unsafeBitCast(0x7f88a8cc2050, to: UIView.self).backgroundColor = UIColor.red

... এবং ফলাফল এটি দুর্দান্ত ছিল!

ইঙ্গিতযুক্ত ভিউ

স্বাভাবিকভাবেই সুন্দর! আশা করি এটা সাহায্য করবে.


3
@iAnurag আপনি যখন কনসোল এরিয়ডে বিরতি দেওয়া হয় তখন আপনি কমান্ডগুলি চালাতে পারেন।
থমস কলমন

2
@ টমক্যালমন আমিও তাই করেছি ... তবে এটি নিম্নলিখিত ত্রুটিটি দেখায় rror: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x7f88a8cc2050). The process has been returned to the state before expression evaluation.
আইআনুরগ

2
expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]nilআমার জন্য প্রত্যাবর্তন
ইগোর অ্যান্ড্রিভ

2
নিশ্চিত করুন যে আপনি 0x7f88a8cc2050 আপনার অবজেক্টের মেমরি ঠিকানার সাথে প্রতিস্থাপন করেছেন এবং যখন এক্সিকিউশনটি বিরতি দেয় তখন কনসোলটিতে কমান্ডটি চালিত হয়।
টম হাওয়ার্ড

3
Unfreakingbelievable। এখানে দুর্দান্ত টিপ, পুরোপুরি আমাকে সরাসরি ইস্যুতে যেতে সহায়তা করেছে। আইটেমটি লাল রঙে পরিবর্তিত হয়ে গেলে, সম্ভব হলে কার্যকর করা চালিয়ে যান এবং আপনি হাইলাইটটি দেখতে পাবেন।
হারুন

255

আপনি একটি যুক্ত করতে চাইবেন Symbolic Breakpoint। অ্যাপল কীভাবে এটি করতে পারে তার জন্য একটি দুর্দান্ত গাইড সরবরাহ করে।

  1. ব্রেকপয়েন্ট পয়েন্ট নেভিগেটরটি খুলুন cmd+7( cmd+8এক্সকোড 9 এ)
  2. Addনীচে বামে বোতামটি ক্লিক করুন
  3. নির্বাচন করা Add Symbolic Breakpoint...
  4. যেখানে এটি Symbolকেবল টাইপ করে বলেUIViewAlertForUnsatisfiableConstraints

আপনি এটিকে অন্য ব্রেকআপপয়েন্টের মতো চিকিত্সা করতে, এটিকে চালু এবং বন্ধ করে, ক্রিয়া যুক্ত করতে বা বার্তা লগ করতে পারেন।


55
আমি ঠিক বুঝতে পারি না কীভাবে আমি এই ইঙ্গিতটি দিয়ে সমস্যাটি আরও ভালভাবে ডিবাগ করতে পারি। আমি একটি প্রতীকী ব্রেকআপপয়েন্ট যুক্ত করেছি তবে এটি এখনও সমস্যাটি আমাকে যথেষ্ট তথ্য দেয় না doesn't একমাত্র উপায় লাইন দ্বারা লাইন পড়ার চেষ্টা করা এবং সমস্যাটির কারণ কী তা বোঝার চেষ্টা করা হচ্ছে .... অন্যথায় সীমাবদ্ধতাগুলি সাফ করে এবং আবার এ্যাসিস্ট্যান্ট ভিউতে পূর্বরূপের সাথে তাদের যুক্ত করা সর্বাধিক সহায়তা করা উচিত!
অ্যালেক্স সিও


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

2
(@ মার্কেআইভি-তে ফলোআপ) আইওএস 7 - এক্সকোড 7 এবং তারপরের থেকে NSLayoutConstraintএকটি identifierসম্পত্তি রয়েছে , যা আইবি স্টোরিবোর্ড এবং কোড থেকে উভয়ই সেট করা যেতে পারে। শনাক্তকারী সেটিং করে আপনি সহজে ডিবাগ লগ ইন সিস্টেম-উৎপন্ন এবং ব্যবহারকারীর তৈরি সীমাবদ্ধতার মধ্যে প্রভেদ করতে পারে, যেমন (উৎস & উদাহরণ: useyourloaf.com/blog/using-identifiers-to-debug-autolayout )myConstraint.identifier = "centered image"
PDK

@ অ্যালেক্সসিও এটি কীভাবে সহায়তা করে? এটি যা ঘটে তা মুহূর্তে বিরতি দেয় least এটি স্ট্যাক ট্রেস দেয় যেখানে আপনি ব্যাকট্র্যাক করতে পারেন এবং উত্সটি আবিষ্কার করতে পারেন ...
হানি

10

স্টিফেনের পরামর্শ অনুসরণ করে কোড এবং হুয়া ডিবাগ করার চেষ্টা করলেন! এটা কাজ করেছে. উত্তরটি ডিবাগ বার্তার মধ্যেই রয়েছে।

Will attempt to recover by breaking constraint NSLayoutConstraint:0x191f0920 H:[MPKnockoutButton:0x17a876b0]-(34)-[MPDetailSlider:0x17a8bc50](LTR)>

উপরের লাইনটি আপনাকে বলে যে রানটাইম এই সীমাবদ্ধতা সরিয়ে কাজ করে। আপনার বোতামে হরাইজেন্টাল স্পেসিংয়ের প্রয়োজন হতে পারে না (এমপিকনকআউটবাটন)। আপনি এই সীমাবদ্ধতাটি সাফ করার পরে এটি রানটাইমের সময় অভিযোগ করবে না এবং আপনি পছন্দসই আচরণ পাবেন।


3
সংকলক? মানে রানটাইম? সংকলক সীমাবদ্ধতা সরিয়ে নি। সংকলকটি রানটাইমটি মোকাবেলা করার জন্য এটি সেখানে রেখেছিল, তাই রানটাইম চলাকালীন "বাধা ভেঙে পুনরুদ্ধার করুন" ।
drhr

হ্যাঁ আমি রানটাইম বোঝাতে
চাইছি

2

যখনই আমি সিস্টেমটি ভেঙে ফেলতে হয়েছিল তার সীমাবদ্ধতাগুলি সরিয়ে দেওয়ার চেষ্টা করি, আমার প্রতিবন্ধকতাগুলি এখন আর আইবি সন্তুষ্ট করার পক্ষে যথেষ্ট নয় (অর্থাত্ আইবিতে "নিখোঁজ বাধা" শো, যার অর্থ তারা অসম্পূর্ণ এবং ব্যবহৃত হবে না)। আমি আসলে এটি সীমাবদ্ধতাটি কম অগ্রাধিকারের দিকে ভেঙে ফেলতে চাইছে এবং এটি (এবং এটি একটি অনুমান) সিস্টেমটি সীমাবদ্ধতার সাথে সীমাবদ্ধতাটি ভেঙে ফেলতে চাইলে আমি এটির কাছাকাছি এসেছি। এটি সম্ভবত সেরা সমাধান নয়, তবে এটি আমার সমস্যার সমাধান করেছে এবং ফলস্বরূপ সীমাবদ্ধতা পুরোপুরি কার্যকর হয়েছিল।


2
সাধারণত এটি এমন একটি পরিস্থিতি যেখানে আপনি প্লেসোল্ডার সীমাবদ্ধতাটি ব্যবহার করতে চান যা রানটাইমের সময় সরানো হয়। প্রতিবন্ধকাকে কোনও স্থানধারকের সীমাবদ্ধতা তৈরি করতে, সীমাবদ্ধ পরিদর্শকের কাছে যান এবং "বিল্ড টাইম এ সরান" ক্লিক করুন। লক্ষ্য করুন যে আইবি অঙ্কন অঞ্চলে সীমাবদ্ধ আই-মরীচি চিহ্নটি ইঙ্গিত করার জন্য নীল থেকে ধূসর হয়ে যায়।
spencery2

1
আমারো একই ইস্যু ছিল. আমি যখন ভাঙ্গা সীমাবদ্ধতা সরিয়ে ফেলি তখন আমার নকশাটি ভেঙে যায়। তাই আমি মাঝারিটিকে অগ্রাধিকার সেট করেছি।
জেরেমি পিডনোয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.