ইন্টারফেস বিল্ডারের সাথে তৈরি একটি নিব ফাইল ব্যবহার করে কীভাবে কোনও ইউআইভিউ লোড করবেন


241

আমি কিছুটা বিস্তৃত করার চেষ্টা করছি, তবে এমন কিছু যা সম্ভব হওয়া উচিত। সুতরাং এখানে আপনার সমস্ত বিশেষজ্ঞের জন্য একটি চ্যালেঞ্জ এখানে রয়েছে (এই ফোরামটি আপনাকে অনেক লোকের একটি প্যাক :))।

আমি একটি প্রশ্নাবলী "উপাদান" তৈরি করছি, যা আমি একটি NavigationContoller(আমার QuestionManagerViewController) -এ লোড করতে চাই । "উপাদান" একটি "খালি" UIViewController, যা উত্তর দেওয়া দরকার এমন প্রশ্নের উপর নির্ভর করে বিভিন্ন মতামত লোড করতে পারে।

আমি যেভাবে এটি করছি তা হ'ল:

  1. UIViewকিছুকে সংজ্ঞায়িত করে সাবক্লাস হিসাবে প্রশ্ন 1 দেখুন অবজেক্ট তৈরি করুন IBOutlets
  2. (ইন্টারফেস বিল্ডার ব্যবহার করে) তৈরি করুন ( Question1View.xib এখানে আমার সমস্যাটি হ'ল )। আমি শ্রেনী 1 UIViewControllerএবং ভিউ উভয়কেই সেট করে দিয়েছি UIView
  3. আমি আউটলেটগুলি ভিউয়ের উপাদান (আইবি ব্যবহার করে) এর সাথে সংযুক্ত করি।
  4. আমি এর মতো দেখতে initWithNibআমার ওভাররাইড করি QuestionManagerViewController:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
        if (self = [super initWithNibName:@"Question1View" bundle:nibBundleOrNil]) {
            // Custom initialization
        }
        return self;
    }

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

2009-05-14 15: 05: 37.152 iMobiDines [17148: 20b] *** অপ্রত্যাশিত ব্যতিক্রমের কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে NSInternalInconsistencyException", কারণ: ' -[UIViewController _loadViewFromNibNamed:bundle:]" প্রশ্ন 1 ভিউ "নিব লোড হয়েছে তবে ভিউ আউটলেটটি সেট করা হয়নি' '

আমি নিশ্চিত যে ভিউকন্ট্রোলার ক্লাস তৈরি করার প্রয়োজন ছাড়াই নিব ফাইল ব্যবহার করে ভিউ লোড করার একটি উপায় আছে।

উত্তর:


224

অ্যারে হিসাবে নিব সাথে আচরণ করার পরিবর্তে ভিউ অ্যাক্সেস করার একটি সহজ উপায়ও রয়েছে।

1 ) আপনি যে কোনও আউটলেট পরে যেতে চাইলে একটি কাস্টম ভিউ সাবক্লাস তৈরি করুন। --আমার মতে

2 ) আপনি যে ইউআইভিভিউ কনট্রোলারটিতে নীবটি লোড করতে এবং পরিচালনা করতে চান, এমন একটি আইবিআউটলেট সম্পত্তি তৈরি করুন যা লোড হওয়া নীবের দর্শন ধরে রাখবে, উদাহরণস্বরূপ

মাইভিউকন্ট্রোলারে (একটি ইউআইভিউকন্ট্রোলার সাবক্লাস)

  @property (nonatomic, retain) IBOutlet UIView *myViewFromNib;

(এটি সংশ্লেষিত করতে এবং আপনার .m ফাইলে ছেড়ে দিতে ভুলবেন না)

3) আইবিতে আপনার নিব খুলুন (আমরা এটিকে 'আমারভিউনিবি.বিসিব' বলব), আপনাকে ফাইলের মালিককে মাইভিউকন্ট্রোলারে সেট করুন

4) এখন আপনার ফাইলের মালিকের আউটলেটটি আমার ভিউফ্রোমনিবকে নিব-এর মূল দৃশ্যে সংযুক্ত করুন।

5) এখন মাইভিউকন্ট্রোলারে নীচের লাইনটি লিখুন:

[[NSBundle mainBundle] loadNibNamed:@"myViewNib" owner:self options:nil];

এখন আপনি এটি করার সাথে সাথে আপনার সম্পত্তিটিকে "self.myViewFromNib" কল করা আপনাকে আপনার নিব থেকে দৃশ্যটিতে অ্যাক্সেস দেবে!


4
এটি প্রধান নিয়ামক দর্শন (স্ব.ভিউ) জন্য কাজ করবে? কিছু কারণে আমাকে স্ট্যান্ডার্ড কন্ট্রোলার আরআর পদ্ধতি পরে নিব থেকে মূল ভিউ লোড করতে হবে। কারণ - জটিল sublassing গঠন
Lukasz

@ লুকাসজ আপনি এটি করতে কতটা সফল? এমনকি আমি আপনার মতো কিছু খুঁজছি।
অজয় শর্মা

দুঃখিত আমি ঘন হতে পারে, কিন্তু আমি প্রথম পর্যায়ে বিভ্রান্ত। আমি কাস্টম ভিউ সাবক্লাসে কীভাবে আউটলেট তৈরি করব? আমি ভেবেছিলাম আউটলেটগুলি কেবলমাত্র ইউআইভিউউকন্ট্রোলারদের জন্য?
jowie

1
এই দৃষ্টিভঙ্গি একাধিক পিতামাতার দর্শনগুলিতে প্রদর্শিত হবে তখন কী হবে? সুতরাং আপনি কি তাদের প্রত্যেকের জন্য ম্যানুয়ালি xib সম্পাদনা করার প্রস্তাব দিচ্ছেন? এটা খুব খারাপ!!!
ব্যবহারকারী 2083364

2
আপনি কেবলমাত্র একক ভিউ নিয়ন্ত্রকের মধ্যে কাস্টম নিব ব্যবহার করতে চাইলে এটি কাজ করে। যে ক্ষেত্রে আপনি এটি আলাদা আলাদা ভিউ কন্ট্রোলারে ব্যবহার করতে চান, প্রতিটি কাস্টম নিবের একটি উদাহরণ তৈরি করে, এটি কার্যকর হবে না।
thgc

120

সবাইকে ধন্যবাদ. আমি যা চাই তা করার উপায় খুঁজে পেয়েছি।

  1. আপনার তৈরি করুন UIViewসঙ্গে IBOutletগুলি আপনি প্রয়োজন।
  2. আইবিতে এক্সিব তৈরি করুন, এটি আপনার পছন্দ অনুযায়ী ডিজাইন করুন এবং এটির মতো লিঙ্ক করুন: ফাইলটির মালিক শ্রেণির UIViewController(কোনও কাস্টম সাবক্লাস নয়, তবে "আসল" এক)। ফাইলের মালিকের দৃষ্টিভঙ্গি মূল দৃশ্যের সাথে সংযুক্ত এবং এর শ্রেণিটি প্রথম পদক্ষেপের 1 হিসাবে ঘোষণা করা হয়েছে)।
  3. এর সাথে আপনার নিয়ন্ত্রণগুলি সংযুক্ত করুন IBOutlet
  4. DynamicViewControllerকি লোড দেখতে / xib সিদ্ধান্ত নেন তার যুক্তিবিজ্ঞান রান করতে পারেন। একবার সিদ্ধান্ত গ্রহণের পরে, loadViewপদ্ধতিতে এই জাতীয় কিছু রাখুন:

    NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"QPickOneView"
                                                      owner:self
                                                    options:nil];
    
    QPickOneView* myView = [ nibViews objectAtIndex: 1];
    
    myView.question = question;

এটাই!

মূল বান্ডেলের loadNibNamedপদ্ধতিটি ভিউটি আরম্ভ করার এবং সংযোগগুলি তৈরি করার যত্ন নেবে।

এখন ভিউকন্ট্রোলার মেমোরিতে থাকা ডেটার উপর নির্ভর করে একটি ভিউ বা অন্য প্রদর্শন করতে পারে এবং "প্যারেন্ট" স্ক্রিনটিকে এই যুক্তি দিয়ে বিরক্ত করার দরকার নেই।


2
আমার একটি খুব অনুরূপ সমস্যা আছে - আমি কেবলমাত্র একটি এক্সিব ফাইল থেকে একটি ইউআইভিউভিড লোড করতে চাই। এই পদক্ষেপগুলি আমার পক্ষে কাজ করে না - সাবভিউ হিসাবে লোড ভিউ যুক্ত করার পরে অ্যাপ্লিকেশনটি "খারাপ অ্যাক্সেস" দিয়ে ক্র্যাশ হয়ে যায়।
জাস্টিকাল

2
আইফোন 3.0.০ এর জন্য প্রথম উপাদানটি পেতে অবজেক্টআটিআইন্ডেক্স: 0 ব্যবহার করুন। এটি আমার জন্য ঠিক জাস্টিকেলের বর্ণিত হিসাবে ক্র্যাশ। কোন ধারণা কেন?
tba

1
এটি আমার জন্য পুরোপুরি কাজ করেছে worked আমি একাধিক মতামত যুক্ত করতে চেয়েছিলাম যার মধ্যে একটি ভিউ কন্ট্রোলার ছিল (আমি একটি ফ্লিপ দর্শন দৃশ্যের ব্যবহার করছি যেখানে দেখার একটি অংশ স্পিন করে) আমাকে অ্যারে 0 (আইফোন 3.0) এ সূচি তৈরি করতে হয়েছিল
আরান মুলহোলল্যান্ড

42
এটি সঠিক উত্তর, তবে কোডটি এমনভাবে সংশোধন করা উচিত যাতে এটি নিবভিউগুলির মাধ্যমে লুপ হয় এবং প্রতিটি বস্তুর উপর একটি শ্রেণি পরীক্ষা করে, যাতে আপনি অবশ্যই সঠিক অবজেক্টটি পেয়ে যাচ্ছেন। অবজেক্টএটিএন্ডেক্স: 1 একটি বিপজ্জনক অনুমান।
এম রায়ান

2
জেসকনিয়াস ঠিক বলেছেন। আপনার যেমন নিবিউ ভিউ অ্যারের মাধ্যমে লুপ করা উচিত: gist.github.com/769539
লিবিয়াথন

71

আমি কিছু উত্তর সম্পর্কে কী বলছে তা নিশ্চিত নই, তবে পরের বার গুগলে অনুসন্ধান করার জন্য আমার এই উত্তরটি এখানে দেওয়া দরকার। কীওয়ার্ডস: "কীভাবে কোনও ইউআইভিউভিউকে কোনও নিব থেকে লোড করবেন" বা "কোনও এনএসবান্ডেল থেকে কোনও ইউআইভিউভ কীভাবে লোড করবেন"।

এখানে অ্যাপ্রেস বিগনিং আইফোন 3 বইটি (পৃষ্ঠা 247, "নতুন টেবিল ভিউ সেল ব্যবহার করে") থেকে প্রায় 100% কোড রয়েছে :

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"Blah"
                                                 owner:self options:nil];
    Blah *blah;
    for (id object in bundle) {
        if ([object isKindOfClass:[Blah class]]) {
            blah = (Blah *)object;
            break;
        }
    }   
    assert(blah != nil && "blah can't be nil");
    [self.view addSubview: blah];
} 

এটি ধরে নেওয়া হয় যে আপনার একটি UIViewসাবক্লাস নামে ডাকা হয় Blah, একটি নিব বলা হয় Blahযার একটিতে UIViewএর শ্রেণি সেট থাকে Blah


বিভাগ: এনএসবজেক্ট + লোডফ্র্যামনিব

#import "NSObject+LoadFromNib.h"

@implementation NSObject (LoadFromNib)

+ (id)loadFromNib:(NSString *)name classToLoad:(Class)classToLoad {
    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil];
    for (id object in bundle) {
        if ([object isKindOfClass:classToLoad]) {
            return object;
        }
    }
    return nil;
}

@end

সুইফট এক্সটেনশন

extension UIView {
    class func loadFromNib<T>(withName nibName: String) -> T? {
        let nib  = UINib.init(nibName: nibName, bundle: nil)
        let nibObjects = nib.instantiate(withOwner: nil, options: nil)
        for object in nibObjects {
            if let result = object as? T {
                return result
            }
        }
        return nil
    }
}

এবং ব্যবহারে একটি উদাহরণ:

class SomeView: UIView {
    class func loadFromNib() -> SomeView? {
        return self.loadFromNib(withName: "SomeView")
    }
}

2
আপনি যদি এটি ব্যবহার করেন তবে isKindOfআপনি বান্ডিল কাঠামোর পরিবর্তনগুলি থেকে সুরক্ষিত।
ড্যান রোজনস্টার্ক

1
একটি assertসম্ভবত একটি ভাল সমাধান হতে পারে। এইভাবে আপনি কেবল সমস্যাটি আড়াল করবেন।
সুলতান

1
@ সুলতান একটি দৃsert়ভাবে অন্তর্ভুক্ত পৃথক। আমি ব্লাব টাইপ করার বস্তুটি যেখানেই এটি নিবতে বসতে চাই । এটি প্রচারিত বা উত্সাহিত হয়েছে কিনা তা আমি চিন্তা করি না। তবে আপনার মন্তব্যের জবাবে আমি দৃ as়তা যুক্ত করেছি, তবে এটি লুপের জায়গায় নয়for । এটি পরিপূরক
ড্যান রোজনস্টার্ক

আপনি কোনও পরামিতি ছাড়াই লোডফ্রমনিব করতে পারেন: + (আইডি) লোডফ্রমনিব {এনএসআরাই * বান্ডেল = [[এনএসবান্ডেল মেইনবান্ডেল] লোডনিবনাম: এনএসএসটিংফ্রমক্লাস ([স্ব শ্রেণি]) মালিক: স্ব বিকল্পসমূহ: নীল]; (বান্ডলে আইডি অবজেক্ট) -এর জন্য - যদি ([অবজেক্টসকিন্ডঅফক্লাস: [স্ব শ্রেণি]]) {রিটার্ন অবজেক্ট; }} রিটার্ন শূন্য; }
জেভিসি

22

কাস্টম ভিউয়ের একাধিক উদাহরণকে পরিচালনা করার জন্য যাদের প্রয়োজন, এটি একটি আউটলেট সংগ্রহ , আমি @ গনসো, @ অ্যাভেরিদেব এবং @ অলি উত্তরগুলি এইভাবে সংহত করে কাস্টমাইজ করেছি:

  1. একটি কাস্টম তৈরি করুন MyView : UIViewএবং এটিকে পছন্দসই XIB এর মূলের " কাস্টম ক্লাস " হিসাবে সেট করুন ; UIViewকাস্টম ক্লাস

  2. আপনার প্রয়োজনীয় সমস্ত আউটলেটগুলি তৈরি করুন MyView(এখনই এটি করুন কারণ পয়েন্ট 3 এর পরে আইবি আপনাকে আউটলেটগুলি সংযুক্ত করার প্রস্তাব দিবে UIViewControllerএবং আমরা যেমন চাই তেমন কাস্টম ভিউয়ের সাথে নয়); কাস্টম ক্লাস নালী

  3. আপনার কাস্টম ভিউ XIB এরUIViewController " ফাইলের মালিক " হিসাবে সেট করুন ; এখানে চিত্র বর্ণনা লিখুন

  4. অ্যাডে আপনার প্রতিটি ইভেন্টের জন্য UIViewControllerএকটি নতুন যুক্ত করুন এবং তাদেরকে একটি আউটলেট সংগ্রহ তৈরির সাথে সংযুক্ত করুন : এই মতামতগুলি কাস্টম ভিউয়ের উদাহরণগুলির জন্য "মোড়ক" দর্শন হিসাবে কাজ করবে; UIViewsMyViewUIViewControllerএখানে চিত্র বর্ণনা লিখুন

  5. শেষ পর্যন্ত, viewDidLoadআপনার UIViewControllerনীচের লাইনগুলিতে যুক্ত করুন:

NSArray *bundleObjects;
MyView *currView;
NSMutableArray *myViews = [NSMutableArray arrayWithCapacity:myWrapperViews.count];
for (UIView *currWrapperView in myWrapperViews) {
    bundleObjects = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
    for (id object in bundleObjects) {
        if ([object isKindOfClass:[MyView class]]){
            currView = (MyView *)object;
            break;
        }
    }

    [currView.myLabel setText:@"myText"];
    [currView.myButton setTitle:@"myTitle" forState:UIControlStateNormal];
    //...

    [currWrapperView addSubview:currView];
    [myViews addObject:currView];
}
//self.myViews = myViews; if need to access them later..

হাই ... আপনি কীভাবে এই সমস্ত প্রোগ্রামাগ্রামিকভাবে করবেন তা জানেন। xib ফাইল ব্যবহার করে না?
এক্স কোডার

19

আমি ইউআইএনআইবি আবার ব্যবহার করার জন্য একটি কাস্টম ইউআইভিউউ ইনস্ট্যান্ট করতে ব্যবহার করব

UINib *customNib = [UINib nibWithNibName:@"MyCustomView" bundle:nil];
MyCustomViewClass *customView = [[customNib instantiateWithOwner:self options:nil] objectAtIndex:0];
[self.view addSubview:customView];

এই ক্ষেত্রে প্রয়োজনীয় ফাইলগুলি হ'ল মাই কাস্টমভিউ.সিবিব , মাই কাস্টমভিউক্লাস.ইচ এবং মাই কাস্টমভিউক্লাস.এম দ্রষ্টব্য যে [UINib instantiateWithOwner]কোনও অ্যারে প্রদান করে, তাই আপনার এমন উপাদানটি ব্যবহার করা উচিত যা আপনি যে ইউআইভিউ পুনরায় ব্যবহার করতে চান তা প্রতিবিম্বিত করে। এক্ষেত্রে এটি প্রথম উপাদান।


1
আপনি কি "র‌্যাঙ্কিংনিব" এর পরিবর্তে লাইন 2 এ "কাস্টমনিব" বলতে চান না
ড্যানি

11

আপনার ভিউ কন্ট্রোলারের ক্লাসটি UIViewইন্টারফেস বিল্ডারের একটি সাবক্লাস হিসাবে সেট করা উচিত নয় । এটি অবশ্যই আপনার সমস্যার অন্তত অংশ part এটি কোনও হিসাবে ছেড়ে দিন UIViewController, এটির কিছু উপশ্রেণী, বা আপনার কাছে থাকা কিছু অন্যান্য কাস্টম শ্রেণি।

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

যদি আপনি UIViewControllerনিজের দর্শনগুলির জন্য আপনার ফাইলের মালিক হিসাবে ব্যবহার করেন তবে আপনি initWithNibName:bundle:এটি লোড করতে এবং ব্যবহারের নিয়ামক অবজেক্টটি ফিরে পেতে ব্যবহার করতে পারেন । আইবিতে, নিশ্চিত হয়ে নিন যে আপনি viewxib এ আপনার ইন্টারফেসের সাহায্যে আউটলেটটি সেট করেছেন । আপনি আপনার ফাইল এর মালিক হিসাবে বস্তুর কিছু অন্যান্য টাইপ ব্যবহার করেন, তাহলে ব্যবহার করতে হবে NSBundleএর loadNibNamed:owner:options:পদ্ধতি ফাইলের মালিকের একটি দৃষ্টান্ত ক্ষণস্থায়ী, নিব লোড করতে পদ্ধতি। আইবিতে আপনার নির্ধারিত আউটলেটগুলি অনুসারে এর সমস্ত সম্পত্তি সঠিকভাবে সেট করা হবে।


আমি অ্যাপ্রেস বইটি পড়ছি, "আইফোন বিকাশের শুরু: আইফোন এসডিকে এক্সপ্লোর করা" এবং তারা 9 তম অধ্যায়ে এই পদ্ধতিটি নিয়ে আলোচনা করেছেন: নেভিগেশন কন্ট্রোলার এবং সারণী দর্শন। এটিকে খুব জটিল মনে হয়নি।
লিন্ডে ফার্গুসন

তারা কীভাবে বলছে এটি সম্পন্ন হয়েছে তা দেখার জন্য আমি কৌতূহল হব। এই মুহুর্তে আমার কাছে সেই বইয়ের একটি অনুলিপি নেই।
মার্ক ডাব্লু

10

আপনি লোডনিবনেডের পরিবর্তে ইউআইভিউউকন্ট্রোলারের আরম্ভের সাথেইনউনিবনেমও ব্যবহার করতে পারেন। এটা সহজ, আমি খুঁজে।

UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"MySubView" bundle:nil];
[self.subview addSubview:aViewController.view];
[aViewController release];  // release the VC

এখন আপনাকে কেবল মাইসউবভিউ.সিবিব এবং মাইসউবিউভিউ / এম তৈরি করতে হবে। মাইসউবভিউ.এক্সিবায় ফাইলের মালিক শ্রেণিটি ইউআইভিউউকন্ট্রোলারে সেট করুন এবং ক্লাসটি মাইসউভিউতে দেখুন।

আপনি subviewপ্যারেন্ট xib ফাইলটি ব্যবহার করে অবস্থান এবং আকারটি করতে পারেন ।


8

এটি একটি দুর্দান্ত প্রশ্ন (+1) এবং উত্তরগুলি প্রায় সহায়ক ছিল;) দুঃখিত, বলছি, তবে আমার এই সময়ের মধ্যে চিৎকার করা হয়েছে, যদিও গনসো এবং অ্যাভিরিদেভ উভয়ই ভাল ইঙ্গিত দিয়েছিল। আশা করি, এই উত্তরটি অন্যদের সহায়তা করবে।

MyVC এই সমস্ত স্টাফ ধারণ করা ভিউ কন্ট্রোলার।

MySubview আমরা একটি xib থেকে লোড করতে চান যে ভিউ হয়

  • MyVC.xib এ, এমন MySubViewআকারের একটি দৃশ্য তৈরি করুন যা সঠিক আকার এবং আকৃতি এবং যেখানে আপনি চান সেখানে অবস্থিত।
  • MyVC.h এ, আছে

    IBOutlet MySubview *mySubView
    // ...
    @property (nonatomic, retain) MySubview *mySubview;
  • MyVC.m এ, @synthesize mySubView;এবং এটি প্রকাশ করতে ভুলবেন না dealloc

  • মাইসউবভিউ। এ, এর জন্য একটি আউটলেট / সম্পত্তি রাখুন UIView *view(এটি অপ্রয়োজনীয় হতে পারে তবে আমার জন্য কাজ করেছে)) সিন্থেসাইজ করুন এবং এটি এম। এ ছেড়ে দিন m
  • মাইসউবিউজ.এক্সিবায়
    • ফাইলের মালিককে টাইপ করুন MySubview, এবং আপনার দর্শনটির সাথে দর্শন সম্পত্তিটি লিঙ্ক করুন।
    • সমস্ত বিট দিন এবং IBOutletপছন্দসই হিসাবে কাঙ্ক্ষিত হিসাবে সংযুক্ত করুন
  • ফিরে MyVC.m, আছে

    NSArray *xibviews = [[NSBundle mainBundle] loadNibNamed: @"MySubview" owner: mySubview options: NULL];
    MySubview *msView = [xibviews objectAtIndex: 0];
    msView.frame = mySubview.frame;
    UIView *oldView = mySubview;
    // Too simple: [self.view insertSubview: msView aboveSubview: mySubview];
    [[mySubview superview] insertSubview: msView aboveSubview: mySubview]; // allows nesting
    self.mySubview = msView;
    [oldCBView removeFromSuperview];

আমার জন্য কৌতূহলোদ্দীপকটি হ'ল: অন্যান্য উত্তরের ইঙ্গিতগুলি xib থেকে আমার দৃষ্টিভঙ্গি বোঝায়, কিন্তু মাইভিসির দৃষ্টিভঙ্গিটি প্রতিস্থাপন করেনি (দুহ!) - আমাকে নিজের থেকেই তা বদলাতে হয়েছিল।

এছাড়াও, mySubviewএর পদ্ধতিগুলিতে অ্যাক্সেস পেতে view.xib ফাইলের বৈশিষ্ট্যটিতে সেট করতে হবে MySubview। অন্যথায়, এটি একটি সাধারণ-পুরানো হিসাবে ফিরে আসে UIView

যদি mySubviewএর নিজস্ব xib থেকে সরাসরি লোড করার কোনও উপায় থাকে তবে তা শিলা হবে তবে আমার যেখানে হওয়া দরকার ছিল এটি আমাকে পেয়েছে।


1
আমি এই পদ্ধতিটি ব্যবহার করেছি, ধন্যবাদ। নেস্টেড ভিউগুলিকে সমর্থন করার জন্য আমি এটির পরিবর্তনের জন্য যা করেছি তা হ'ল [ সেলফ ভিউ ইনসেটসউবভিউ: এমএসভিউ উপরের সাবউভিউ: মাইসউভিউ]]; [ মাইসউবভিউ.সুপারভিউ ইনসার্টসউবভিউ: এমএসভিউ উপরের সাবউউভিউ: মাইসউভিউ] তে;
জেসন

8

এটি এমন কিছু যা সহজ হওয়া উচিত। আমি বাছাই UIViewControllerএবং একটি loadNib:inPlaceholder:নির্বাচক যোগ শেষ । এখন আমি বলতে পারি

self.mySubview = (MyView *)[self loadNib:@"MyView" inPlaceholder:mySubview];

বিভাগের জন্য কোড এখানে (এটি গনসো বর্ণিত একই rigamarol করে):

@interface UIViewController (nibSubviews)

- (UIView *)viewFromNib:(NSString *)nibName;
- (UIView *)loadNib:(NSString *)nibName inPlaceholder:(UIView *)placeholder;

@end

@implementation UIViewController (nibSubviews)

- (UIView *)viewFromNib:(NSString *)nibName
{
  NSArray *xib = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; 
  for (id view in xib) { // have to iterate; index varies
    if ([view isKindOfClass:[UIView class]]) return view;
  }
  return nil;
}

- (UIView *)loadNib:(NSString *)nibName inPlaceholder:(UIView *)placeholder
{
  UIView *nibView = [self viewFromNib:nibName];
  [nibView setFrame:placeholder.frame];
  [self.view insertSubview:nibView aboveSubview:placeholder];
  [placeholder removeFromSuperview];
  return nibView;
}

@end

7

দ্রুত

আসলে আমার এই সমস্যার সমাধানটি ছিল, আমার কাস্টমভিউ কনট্রোলারের যেখানে ভিউটি আমি এর মতো ব্যবহার করতে চেয়েছিলাম সেখানে ভিডলিডলয়েডটিতে ভিউ লোড করা:

myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView

কোনও loadView()পদ্ধতিতে ভিউ লোড করবেন না ! লোডভিউ পদ্ধতিটি আপনার কাস্টম ভিউকন্ট্রোলারের জন্য ভিউ লোড করার জন্য পরিবেশন করে।


6

আমিও অনুরূপ কিছু করতে চেয়েছিলাম, এটিই আমি পেয়েছি: (এসডিকে ৩.১.৩)

আমার কাছে একটি ভিউ কন্ট্রোলার এ (নিজেই এটি নাভ কন্ট্রোলারের মালিকানাধীন) যা একটি বোতাম টিপে ভিসি বি লোড করে:

এভিউকন্ট্রোল.আর

BViewController *bController = [[BViewController alloc] initWithNibName:@"Bnib" bundle:nil];
[self.navigationController pushViewController:bController animated:YES];
[bController release];

এখন ভিসি বি-এর ইন্টারফেস বনিব থেকে রয়েছে, তবে যখন একটি বোতাম টিপানো হয়, আমি একটি 'সম্পাদনা মোডে' যেতে চাই যার একটি পৃথক নিবি থেকে আলাদা ইউআই থাকে, তবে আমি সম্পাদনা মোডের জন্য একটি নতুন ভিসি চাই না, আমি চাই যে নতুন নিবটি আমার বিদ্যমান বি ভিসির সাথে যুক্ত হোক।

সুতরাং, বিভিউকন্ট্রোলআরএম (বোতাম টিপুন পদ্ধতিতে)

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"EditMode" owner:self options:nil];
UIView *theEditView = [nibObjects objectAtIndex:0];
self.editView = theEditView;
[self.view addSubview:theEditView];

তারপরে অন্য বোতামে টিপুন (সম্পাদনা মোডে প্রস্থান করতে):

[editView removeFromSuperview];

এবং আমি আমার মূল Bnib ফিরে আসছি।

এটি দুর্দান্ত কাজ করে, তবে মনে রাখবেন যে আমার এডিটমোড.নিব এর মধ্যে কেবলমাত্র 1 টি শীর্ষ স্তরের আপত্তি রয়েছে, একটি ইউআইভিউ আপত্তি। এই এনআইবিতে ফাইলের মালিক বিভিউকন্ট্রোলার বা ডিফল্ট এনএসবজেক্ট হিসাবে সেট করা আছে তা বিবেচনাধীন নয়, তবে ফাইলটির মালিকের ভিউ আউটলেট কোনও কিছুর জন্য সেট করা নেই তা নিশ্চিত করুন। যদি এটি হয় তবে আমি একটি এক্স_আবাদ_অ্যাক্সেস ক্র্যাশ পেয়েছি এবং এক্সকোডটি 6677 স্ট্যাক ফ্রেমগুলি লোড করতে এগিয়ে যায় যা বারবার বলা হয় এমন একটি অভ্যন্তরীণ ইউআইভিউ পদ্ধতি দেখায় ... সুতরাং অসীম লুপের মতো দেখায়। (তবে ভিউ আউটলেটটি আমার মূল Bnib এ সেট করা আছে)

আশাকরি এটা সাহায্য করবে.


লাইনের মধ্যে পড়া, এটি আমাকে খুব সাহায্য করেছিল।
পিটার্ট

লিঙ্কে থাকা তথ্য অনুযায়ী আপনারা এইভাবে ভিউ কন্ট্রোলারদের কারসাজি করা উচিত নয়।
টি। মার্কেল

6

আমি আমার পছন্দ মতো একটি বিভাগ তৈরি করেছি:

UIView+NibInitializer.h

#import <UIKit/UIKit.h>

@interface UIView (NibInitializer)
- (instancetype)initWithNibNamed:(NSString *)nibNameOrNil;
@end

UIView+NibInitializer.m

#import "UIView+NibInitializer.h"

@implementation UIView (NibInitializer)

- (instancetype)initWithNibNamed:(NSString *)nibNameOrNil
{
    if (!nibNameOrNil) {
        nibNameOrNil = NSStringFromClass([self class]);
    }
    NSArray *viewsInNib = [[NSBundle mainBundle] loadNibNamed:nibNameOrNil
                                                        owner:self
                                                      options:nil];
    for (id view in viewsInNib) {
        if ([view isKindOfClass:[self class]]) {
            self = view;
            break;
        }
    }
    return self;
}

@end

তারপরে, এভাবে কল করুন:

MyCustomView *myCustomView = [[MyCustomView alloc] initWithNibNamed:nil];

আপনার ক্লাসের নাম বাদে যদি আপনার নিবটির নাম দেওয়া থাকে তবে একটি নিব নাম ব্যবহার করুন।

অতিরিক্ত আচরণের জন্য এটি আপনার সাবক্লাসে ওভাররাইড করতে এটি দেখতে দেখতে এটি দেখতে পারা যায়:

- (instancetype)initWithNibNamed:(NSString *)nibNameOrNil
{
    self = [super initWithNibNamed:nibNameOrNil];
    if (self) {
        self.layer.cornerRadius = CGRectGetHeight(self.bounds) / 2.0;
    }
    return self;
}

5

ডিজাইনেবল বিকল্প সহ সুইফ্ট ব্যবহারকারীর জন্য:

  1. একটি কাস্টম UIViewসাবক্লাস এবং একটি xib ফাইল তৈরি করুন , যা আমরা আমাদের নিজস্ব শ্রেণির নাম অনুসারে রাখব: আমাদের ক্ষেত্রে মেমভিউ। মেম ভিউ ক্লাসের অভ্যন্তরে @IBDesignableশ্রেণীর ঘোষণার আগে এট্রিবিউট সহ এটি ডিজাইনযোগ্য হিসাবে সংজ্ঞায়িত করতে ভুলবেন না
  2. UIViewইন্ডেটিটি ইন্সপেক্টর প্যানেলে আমাদের কাস্টম সাবক্লাসের সাথে এক্সবিতে ফাইলের মালিক সেট করতে রেন্ডার

    এখানে চিত্র বর্ণনা লিখুন

  3. এক্সআইবি ফাইলটিতে এখন আমরা আমাদের ইন্টারফেসটি তৈরি করতে পারি, সীমাবদ্ধতা তৈরি করতে পারি, আউটলেটগুলি তৈরি করতে পারি, ক্রিয়া ইত্যাদি করতে পারি এখানে চিত্র বর্ণনা লিখুন

  4. একবার এক্সবিআইএসআইজি চালু করার জন্য আমাদের কাস্টম ক্লাসে কয়েকটি পদ্ধতি প্রয়োগ করতে হবে

    class XibbedView: UIView {

    weak var nibView: UIView!
    
    override convenience init(frame: CGRect) {
        let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
        self.init(nibName: nibName)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
        let nib = loadNib(nibName)
        nib.frame = bounds
        nib.translatesAutoresizingMaskIntoConstraints = false
        addSubview(nib)
        nibView = nib
        setUpConstraints()
    }
    
    init(nibName: String) {
        super.init(frame: CGRectZero)
        let nibName = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
        let nib = loadNib(nibName)
        nib.frame = bounds
        nib.translatesAutoresizingMaskIntoConstraints = false
        addSubview(nib)
        nibView = nib
        setUpConstraints()
    }
    
    func setUpConstraints() {
        ["V","H"].forEach { (quote) -> () in
            let format = String(format:"\(quote):|[nibView]|")
            addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: [], metrics: nil, views: ["nibView" : nibView]))
        }
    }
    
    func loadNib(name: String) -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: name, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    
        return view
    }

    }

  5. আমাদের কাস্টম শ্রেণিতে আমরা কিছু পরিদর্শনযোগ্য বৈশিষ্ট্যও সংজ্ঞায়িত করতে পারি ইন্টারফেস নির্মাতা থেকে তাদের উপর সম্পূর্ণ নিয়ন্ত্রণ রাখতে

    @IBDesignable class MemeView: XibbedView {

    @IBInspectable var memeImage: UIImage = UIImage() {
        didSet {
            imageView.image = memeImage
        }
    }
    @IBInspectable var textColor: UIColor = UIColor.whiteColor() {
        didSet {
            label.textColor = textColor
        }
    }
    @IBInspectable var text: String = "" {
        didSet {
            label.text = text
        }
    }
    @IBInspectable var roundedCorners: Bool = false {
        didSet {
            if roundedCorners {
                layer.cornerRadius = 20.0
                clipsToBounds = true
            }
            else {
                layer.cornerRadius = 0.0
                clipsToBounds = false
            }
        }
    }
    
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var imageView: UIImageView!

}

কয়েকটি উদাহরণ:
এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

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

আশা করি এটি এখানে একটি সম্পূর্ণ নমুনা ডাউনলোড করা যায় helps


সম্পূর্ণ নিবন্ধটি আমার ব্লগ ক্লাউন্ডিনটিচ.ইট / ২০১/0 / ২০১৪ / ২১ / ডিজাইনযোগ্য- এক্সিব- ইন- এক্সকোড -হেল- ইয়েহ থেকে দেখা যাবে তবে আমি ইতিমধ্যে সংশ্লিষ্ট অংশটি পোস্ট করেছি।
আন্দ্রে

let nib = loadNib(nibName)এটি একটি এক্সবেডভিউ উদাহরণ, আপনি যদি `` `অ্যাডসুবিউ (নীব)` `call কল করেন তবে আপনি একটি এক্সবেডভিউ উদাহরণটি অন্য একটি এক্সবেডভিউ দৃষ্টান্তে যুক্ত করছেন?
উইলিয়াম হু

আমি এই বিষয়টিতে একমত আপনি যখন এটি "ডিবাগ ভিউ হায়ারার্কি" থেকে দেখার চেষ্টা করেন মনে হয় জিববেডভিউতে একটি জিববেডভিউ রয়েছে। আপনি এটি দেখতে পারেন.
উইলিয়াম হু

@ উইলিয়ামহু আপনি যদি সরবরাহের উদাহরণটি ডোন্ডলোড করেন তবে আপনি দেখতে পাচ্ছেন যে মেমভিউ.এক্সিব হ'ল একটি ইউভিউ দৃষ্টিকোণের সংক্ষিপ্তসার সহ, ফাইল হোল্ডারটি একটি মেমভিউ যা জিববেডভিউয়ের একটি সাবক্লাস। সুতরাং জিববেডভিউয়ের একমাত্র উদাহরণটি কেবল মেমভিউ যা একটি এক্সিব ফাইল লোড করে যেখানে মূল দৃশ্যটি কেবল একটি দৃশ্য
আন্ড্রেয়া

ওহ ঠিক আছে তাহলে. আমি এটি পরীক্ষা করব। ধন্যবাদ!
উইলিয়াম হু

4

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


লিঙ্কটি মারা গেছে। আমি বিশ্বাস করি যে এটি এখন বিগনারড্রান্স
blog

3

পূর্ববর্তী উত্তরটি আইফোন এসডিকে ২.০ থেকে ২.১ এর মধ্যে সংঘটিত এনআইবি (এক্সআইবি) কাঠামোর পরিবর্তনটিকে বিবেচনা করে না। ব্যবহারকারীর সামগ্রী এখন 1 এর পরিবর্তে 0 সূচকে শুরু হয়।

আপনি ২.১ ম্যাক্রোটি ব্যবহার করতে পারেন যা সমস্ত সংস্করণ ২.১ এবং তারপরের জন্য বৈধ ((এটি আইফোনের আগে দুটি আন্ডারস্কোর:

 // Cited from previous example
 NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"QPickOneView" owner:self options:nil];
 int startIndex;
 #ifdef __IPHONE_2_1
 startIndex = 0;
 #else
 startIndex = 1;
 #endif
 QPickOneView* myView = [ nibViews objectAtIndex: startIndex];
 myView.question = question;

আমরা আমাদের বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এর অনুরূপ একটি কৌশল ব্যবহার করি।

বার্নি


2
বার্নি: "পূর্ববর্তী উত্তর" স্ট্যাক ওভারফ্লোতে অর্থহীন কারণ ভোটের উপর ভিত্তি করে উত্তরগুলি শিফট অবস্থান। "ফ্রেডের উত্তর" বা "বার্নির উত্তর" বা "অলি এর উত্তর" উল্লেখ করা ভাল।
অলি

3

আমার একই কাজ করার কারণ ছিল (প্রোগ্রামিয়ালি একটি এক্সআইবি ফাইল থেকে একটি ভিউ লোড করা), তবে আমার এটি সম্পূর্ণরূপে একটি এর একটি সাবক্লাসের সাবক্লাসের প্রসঙ্গে UIView(যেমন কোনওভাবে ভিউ কন্ট্রোলারকে জড়িত না করে) করা দরকার। এটি করার জন্য আমি এই ইউটিলিটি পদ্ধতিটি তৈরি করেছি:

+ (id) initWithNibName:(NSString *)nibName withSelf:(id)myself {

    NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:nibName
                                                    owner:myself options:nil];
    for (id object in bundle) {
        if ([object isKindOfClass:[myself class]]) {
            return object;
        }
    }  

    return nil;
} 

তারপরে আমি আমার সাবক্লাসের initWithFrameপদ্ধতি থেকে এটি কল করি :

- (id)initWithFrame:(CGRect)frame {

    self = [Utilities initWithNibName:@"XIB1" withSelf:self];
    if (self) {
        // Initialization code.
    }
    return self;
}

সাধারণ আগ্রহের জন্য পোস্ট করা; কেউ যদি এইভাবে এটি না করেই কোনও সমস্যা দেখেন তবে দয়া করে আমাকে জানান।


আমি আপনার কোডটি প্রয়োগ করেছি, তবে এটি আরআইডি এর বাইরে চলে যায়। আমি আপনার স্ট্যাটিক পদ্ধতিটি একটি ইউটিলিটি ক্লাসে তৈরি করেছি। আমি আমার ভিউ (ইউআইভিউ থেকে সাবক্ল্যাসড) নামে এইচ / এম ফাইলগুলি তৈরি করেছি এবং এটির নামের একটি জাইবি। আইবিতে আমি xib ফাইলের মালিক এবং ভিউটিকে "মাইভিউ" তে সেট করেছিলাম। ডিবাগারে এটি সুযোগের বাইরে। আমি আইবিতে কিছু মিস করছি?
টাইগারকডিং

: দয়া করে এখানে আমার নতুন তাই প্রশ্ন কটাক্ষপাত আছে stackoverflow.com/questions/9224857/...
TigerCoding

স্ব = [ইউটিলিটিস initWithNibName: @ "XIB1" সহ সেলফ: স্ব]; এখনও সেট না করা অবস্থায় আপনি নিজেকে অতিক্রম করছেন। কোডটি কি এর মতো নয়: স্ব = [ইউটিলিটিস initWithNibName: @ "XIB1" সহ সেলফ: নীল]; ?
কেন ভ্যান হোয়েল্যান্ড

@ জাভি: এখানে আমার কোডের নমুনা এআরসি-র সাথে কাজ নাও করতে পারে - আমি এটিআরসি সক্ষম করে পরীক্ষা করেছি না।
মুসিজেনেসিস

3

সুইফটে এটি করার একটি উপায় এখানে রয়েছে (বর্তমানে এক্সকোড 7 বিটা 5 তে সুইফট 2.0 লিখছেন)।

আপনার UIViewসাবক্লাসটি যা আপনি ইন্টারফেস বিল্ডারে "কাস্টম ক্লাস" হিসাবে সেট করেছেন তা থেকে একটি পদ্ধতি তৈরি করুন (আমার সাবক্লাসটি রেকর্ডিংফুটারভিউ নামে পরিচিত):

class func loadFromNib() -> RecordingFooterView? {
    let nib = UINib(nibName: "RecordingFooterView", bundle: nil)
    let nibObjects = nib.instantiateWithOwner(nil, options: nil)
    if nibObjects.count > 0 {
        let topObject = nibObjects[0]
        return topObject as? RecordingFooterView
    }
    return nil
}

তারপরে আপনি এটিকে কেবল এটির মতো কল করতে পারেন:

let recordingFooterView = RecordingFooterView.loadFromNib()


2

উত্তরের কোনওটিই ব্যাখ্যা করে না যে কীভাবে একা একাদশ স্ট্যান্ড তৈরি করা যায় যা এই প্রশ্নের মূল। এমন কিছু নেইXcode 4"নতুন এক্সআইবি ফাইল তৈরি করুন" বিকল্প ।

এটা করতে

1) Choose "New File..."
2) Choose the "User Interface" category under the iOS section
3) Choose the "View" item
4) You will then be prompted to choose an iPhone or iPad format

এটি সহজ বলে মনে হতে পারে তবে এটি "XIB" শব্দটি কোথাও না উপস্থিত হওয়ার কারণে এটি আপনার চারপাশে ঝাঁকুনিতে কয়েক মিনিট বাঁচাতে পারে।


1

@AVeryDev

)) আপনার দেখার নিয়ামকের দৃশ্যে বোঝা ভিউটি সংযুক্ত করতে:

[self.view addSubview:myViewFromNib];

সম্ভবত, মেমরির ফাঁস এড়াতে ভিউ থেকে এটি সরিয়ে ফেলা প্রয়োজন।

স্পষ্ট করার জন্য: ভিউ কন্ট্রোলারের বেশ কয়েকটি আইবিআউটলেট রয়েছে যার মধ্যে কয়েকটি আসল নিব ফাইলের আইটেমের সাথে সংযুক্ত থাকে (যথারীতি), এবং কিছু লোড নিব-এর আইটেমের সাথে সংযুক্ত থাকে। দু'জনেরই একই মালিক শ্রেণি রয়েছে। লোড ভিউটি আসলটি ওভারলে করে।

ইঙ্গিত: লোড নিবলের মূল দৃশ্যের অস্বচ্ছতাটি শূন্যে সেট করুন, তারপরে এটি মূল নিব থেকে আইটেমগুলিকে অস্পষ্ট করবে না।


নজর রাখার জন্য ভাল জিনিস, তবে একটি মতামত হিসাবে একটি ভিউ যুক্ত করা স্বয়ংক্রিয়ভাবে এটি পূর্ববর্তী পিতামাতার থেকে সরিয়ে দেয় যাতে এটি ফুটো না হয়।
আরিদেব

1

বেশ কয়েক ঘন্টা ব্যয় করার পরে, আমি নিম্নলিখিত সমাধানটি জালিয়াছি। কাস্টম তৈরি করতে এই পদক্ষেপগুলি অনুসরণ করুন UIView

1) বর্গ তৈরি করুন myCustomView থেকে উত্তরাধিকারসূত্রে UIView
এখানে চিত্র বর্ণনা লিখুন

2) তৈরি করুন .xib নামের সঙ্গে myCustomView
এখানে চিত্র বর্ণনা লিখুন

3) শ্রেণী পরিবর্তন UIView , আপনার .xib ফাইল ভিতরে বরাদ্দ myCustomView ক্লাস আছে।
এখানে চিত্র বর্ণনা লিখুন

4) আইবিউটলেটগুলি তৈরি করুন
এখানে চিত্র বর্ণনা লিখুন

5) মাই কাস্টমভিউ * কাস্টমভিউতে .xib লোড করুন । নিম্নলিখিত নমুনা কোড ব্যবহার করুন।

myCustomView * myView = [[[NSBundle mainBundle] loadNibNamed:@"myCustomView" owner:self options:nil] objectAtIndex:0];
[myView.description setText:@"description"];

দ্রষ্টব্য: যারা এখনও সমস্যার মুখোমুখি হয়ে মন্তব্য করতে পারেন, তাদের জন্য আমি আমার কাস্টমভিউয়ের সাথে নমুনা প্রকল্পের লিঙ্ক সরবরাহ করব



0

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

মাইভিউ নামে শ্রেণীর উদাহরণ।

  • ইন্টারফেস বিল্ডারে MyView.xib নামে একটি নিব ফাইল তৈরি করুন
  • ইন্টারফেস বিল্ডারে, একটি ইউআইভিউ যুক্ত করুন। এর ক্লাসটি মাইভিউতে সেট করুন। আপনার হৃদয়ের সামগ্রীতে কাস্টমাইজ করুন, মাইভিউর উদাহরণস্বরূপ ভেরিয়েবলগুলি সাবউভিউগুলিতে আপনি পরে অ্যাক্সেস করতে চান।
  • আপনার কোডে, নতুন মাইভিউ এর মতো তৈরি করুন:

    মাইভিউ * মাইভিউ = [মাইভিউ নিব_ভিউ ফ্রেমনিবউইথওয়নার: মালিক];

এখানে এর জন্য বিভাগটি রয়েছে:

@implementation UIView (nib)

+ (id) nib_viewFromNib {
    return [self nib_viewFromNibWithOwner:nil];
}

+ (id) nib_viewFromNibWithOwner:(id)owner {
    NSString *className = NSStringFromClass([self class]);
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:className owner:owner options:nil];
    UIView *view = nil;
    for(UIView *v in nib) {
        if ([v isKindOfClass:[self class]]) {
            view = v;
            break;
        }
    }
    assert(view != nil && "View for class not found in nib file");
    [view nib_viewDidLoad];
    return view;
}

// override this to do custom setup
-(void)nib_viewDidLoad {

}

আমি তারপরে আমি যে নিয়ামকটি ব্যবহার করছি তার ক্রিয়া সহ বোতামগুলি তারে রেখেছি এবং আমার কাস্টম ভিউ সাবক্লাসের আউটলেটগুলি ব্যবহার করে লেবেলে জিনিসগুলি সেট করেছিলাম।


0

প্রোগ্রামটিমেটিকভাবে সুইফট 4-এ কোনও নিব / এক্সিবের থেকে একটি ভিউ লোড করতে:

// Load a view from a Nib given a placeholder view subclass
//      Placeholder is an instance of the view to load.  Placeholder is discarded.
//      If no name is provided, the Nib name is the same as the subclass type name
//
public func loadViewFromNib<T>(placeholder placeholderView: T, name givenNibName: String? = nil) -> T {

    let nib = loadNib(givenNibName, placeholder: placeholderView)
    return instantiateView(fromNib: nib, placeholder: placeholderView)
}

// Step 1: Returns a Nib
//
public func loadNib<T>(_ givenNibName: String? = nil, placeholder placeholderView: T) -> UINib {
    //1. Load and unarchive nib file
    let nibName = givenNibName ?? String(describing: type(of: placeholderView))

    let nib = UINib(nibName: nibName, bundle: Bundle.main)
    return nib
}

// Step 2: Instantiate a view given a nib
//
public func instantiateView<T>(fromNib nib: UINib, placeholder placeholderView: T) -> T {
    //1. Get top level objects
    let topLevelObjects = nib.instantiate(withOwner: placeholderView, options: nil)

    //2. Have at least one top level object
    guard let firstObject = topLevelObjects.first else {
        fatalError("\(#function): no top level objects in nib")
    }

    //3. Return instantiated view, placeholderView is not used
    let instantiatedView = firstObject as! T
    return instantiatedView
}

-1

আমি এর জন্য ইউআইভিউতে একটি বিভাগ যুক্ত করে শেষ করেছি:

 #import "UIViewNibLoading.h"

 @implementation UIView (UIViewNibLoading)

 + (id) loadNibNamed:(NSString *) nibName {
    return [UIView loadNibNamed:nibName fromBundle:[NSBundle mainBundle] retainingObjectWithTag:1];
 }

 + (id) loadNibNamed:(NSString *) nibName fromBundle:(NSBundle *) bundle retainingObjectWithTag:(NSUInteger) tag {
    NSArray * nib = [bundle loadNibNamed:nibName owner:nil options:nil];
    if(!nib) return nil;
    UIView * target = nil;
    for(UIView * view in nib) {
        if(view.tag == tag) {
            target = [view retain];
            break;
        }
    }
    if(target && [target respondsToSelector:@selector(viewDidLoad)]) {
        [target performSelector:@selector(viewDidLoad)];
    }
    return [target autorelease];
 }

 @end

এখানে ব্যাখ্যা: ভিউকন্ট্রোলার আইওএস এবং ম্যাকটিতে কম ভিউ লোড হচ্ছে


এইচআরএম। ট্যাগ দিয়ে কি আছে?
n13

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