সুইফটে উপস্থিতি


125

আমি আমার অ্যাপটিকে সুইফট ভাষায় রূপান্তরিত করার চেষ্টা করছি।

আমার এই কোডের লাইন আছে:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
                     setTitleTextAttributes:textDictionary
                                   forState:UIControlStateNormal];

কীভাবে এটিকে সুইফটে রূপান্তর করবেন?

ইন অ্যাপলের ডক্স , এমন কোনো পদ্ধতি।


1
@ লুক ইওসকিউর নীচে আমার উত্তরগুলি দেখুন ... কুরুচিপূর্ণ, কিন্তু কাজ করে।
টিসিডি

উত্তর:


230

আইওএস 9 এর জন্য আপডেট করুন:

আপনি যদি আইওএস 9+ (এক্সকোড 7 বি 1 হিসাবে) টার্গেট করে থাকেন তবে UIAppearanceপ্রোটোকলে একটি নতুন পদ্ধতি রয়েছে যা ভারার্গস ব্যবহার করে না:

static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self

যা এর মতো ব্যবহার করা যেতে পারে:

UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light

আপনার যদি এখনও আইওএস 8 বা তার আগে সমর্থন করতে হয় তবে এই প্রশ্নের নিম্নলিখিত মূল উত্তরটি ব্যবহার করুন।

আইওএস 8 এবং 7 এর জন্য:

এই পদ্ধতিগুলি সুইফটের কাছে উপলভ্য নয় কারণ ওবজ-সি ভারাজ পদ্ধতিগুলি সুইফটের সাথে সামঞ্জস্যপূর্ণ নয় (দেখুন http://www.openradar.me/17302764 )।

আমি একটি ভিন্ন-বৈচিত্র্যময় কার্যপত্রক লিখেছিলাম যা সুইফটে কাজ করে (আমি একই পদ্ধতির পুনরাবৃত্তি করেছি UIBarItem, যা থেকে আসে না UIView):

// UIAppearance+Swift.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (UIViewAppearance_Swift)
// appearanceWhenContainedIn: is not available in Swift. This fixes that.
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass;
@end
NS_ASSUME_NONNULL_END

-

// UIAppearance+Swift.m
#import "UIAppearance+Swift.h"
@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
    return [self appearanceWhenContainedIn:containerClass, nil];
}
@end

#import "UIAppearance+Swift.h"আপনার ব্রিজিং শিরোনামে কেবল নিশ্চিত হন ।

তারপরে, সুইফ্ট থেকে কল করতে (উদাহরণস্বরূপ):

# Swift 2.x:
UITextField.my_appearanceWhenContainedIn(MyViewController.self).keyboardAppearance = .Light

# Swift 3.x:
UITextField.my_appearanceWhenContained(in: MyViewController.self).keyboardAppearance = .light

15
ইউআইবারবারটন আইটেম কোনও ইউআইভিউ নয় এবং আলাদাভাবে প্রসারিত হওয়া দরকার
সের্গেই স্কোব্লিকভ

7
লক্ষ্য করুন iOS8 অন্তত, UIAppearance + + Swift.h UIKit / UIKit.h আমদানি উচিত
চেজ

আপনি যদি কেবলমাত্র ইউআইভিউর পরিবর্তে ইউআইবারবার বাটন আইটেমকে লক্ষ্য করে অন্য কোনও পদ্ধতি তৈরি করেন তবে ইউআইবারবারটন আইটেমটিও সমর্থন করা যেতে পারে। @ ইনটারফেস ইউআইবারবারটন আইটেম (ইউআইভিউ অ্যাপিয়ারেন্স_সইউফ্ট)
মাইকেল পিটারসন

1
@ আরপটউস্টি: আমি সুইফট ৩-এর জন্য একটি উদাহরণ যুক্ত করেছি, এটি কিছুটা আলাদা
অ্যালেক্স প্রীতিজলভ

1
সুইফট 3.2 জন্য iOS 9 এর সংস্করণ UIBarButtonItem.appearance আছে (whenContainedInInstancesOf: [UISearchBar.self]) নাম = "সম্পন্ন হয়েছে"।
এলি বার্ক

31

ios 10 swift 3

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Kapat"

1
আইওএস 10 সুইফ্ট 3-তে এটি করার উপায় হওয়ায় এটিকে কেন ডাউন ডাউন বলা হচ্ছে তা জানেন না ... ধন্যবাদ
ভ্যাসিলি

14

আইওএস 8 এবং 7 এর জন্য:

আমি একাধিক ধারক নির্দিষ্ট করতে অ্যালেক্সের উত্তরের ভিত্তিতে একটি বিভাগ ব্যবহার করি। অ্যাপল সুইফটে আনুষ্ঠানিকভাবে সমর্থন appearanceWhenContainedInনা করা অবধি এটি কার্যকর নয় ।

UIAppearance + + Swift.h

@interface UIView (UIAppearance_Swift)
/// @param containers An array of Class<UIAppearanceContainer>
+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers;
@end

UIAppearance + + Swift.m

@implementation UIView (UIAppearance_Swift)

+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers
{
    NSUInteger count = containers.count;
    NSAssert(count <= 10, @"The count of containers greater than 10 is not supported.");
    
    return [self appearanceWhenContainedIn:
            count > 0 ? containers[0] : nil,
            count > 1 ? containers[1] : nil,
            count > 2 ? containers[2] : nil,
            count > 3 ? containers[3] : nil,
            count > 4 ? containers[4] : nil,
            count > 5 ? containers[5] : nil,
            count > 6 ? containers[6] : nil,
            count > 7 ? containers[7] : nil,
            count > 8 ? containers[8] : nil,
            count > 9 ? containers[9] : nil,
            nil];
}
@end

তারপরে #import "UIAppearance+Swift.h"আপনার ব্রিজিং হেডারটিতে যুক্ত করুন।

সুইফ্ট থেকে ব্যবহার করতে :

TextField.appearanceWhenContainedWithin([MyViewController.self, TableViewController.self]).keyboardAppearance = .Light

সিভিআরআরটাইপ ব্যবহার করে যদি কোনও উপায় খুঁজে পেতে পারি তবে এটি ভাল ছিল তবে আমি কোনও পরিষ্কার সমাধান খুঁজে পাইনি।


ভ্যারার্গসের ভাঙা-ভাড়ার চমৎকার কাজ! এটি সত্যই খুব খারাপ যে অ্যাপলের আইওএস 9-কেবল পদ্ধতি ব্যবহার করে (এখন) ব্যতীত কোনও সাধারণ সমাধান নেই।
অ্যালেক্স প্রেটজ্লাভ

12

এখানে @tun দ্বারা অনুপ্রাণিত একটি কম কুরুচিপূর্ণ, কিন্তু এখনও কুরুচিপূর্ণ।

  1. আপনার উদ্দেশ্য-সি উপস্থিতি ধরে রাখতে একটি শ্রেণি তৈরি করুন। এই উদাহরণের উদ্দেশ্যগুলির জন্য, আসুন এটি কল করুন AppearanceBridger
  2. আপনার ব্রিজিং শিরোনামে এই শ্রেণিটি যুক্ত করুন। আপনার যদি ব্রিজিং হেডার না থাকে তবে একটি তৈরি করুন
  3. AppearanceBridgerনামে একটি শ্রেণি পদ্ধতি তৈরি করুন +(void)setAppearanceএবং এই পদ্ধতিতে উদ্দেশ্য-সি উপস্থিতি কোডটি রাখুন। উদাহরণ স্বরূপ:


+ (void)setAppearance {
    [[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setBackgroundColor:[UIColor whiteColor]];
}

  1. আপনার সুইফ্ট কোডে যেখানে আপনি উপস্থিতিটি সেট করেছেন সেখানে কল করুন AppearanceBridger.setAppearance()এবং আপনার যাওয়া ভাল হবে!

আশা করি এটি যারা দেখেন তাদের পক্ষে এটি ভাল কাজ করে।


4

এখানে আমি ব্যবহার করেছি একটি কুরুচিপূর্ণ সমাধান সমাধান ....

আপনি যা খুশি তাই কেবল একটি উদ্দেশ্য-সি কোকো টাচ ক্লাস (ইউআইভিউকন্ট্রোলার) করুন।

আমি আমার নাম WorkaroundViewController...

এখন ( WorkaroundViewController.m):

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

এর জন্য উদ্দেশ্য-সি উপস্থিতি কোডটি চালান .appearanceWhenContainedIn()(এখানে আমার উদাহরণ):

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Avenir-Light" size:16.0f]}];

তারপরে আপনার সুইফ্ট প্রকল্পের জন্য একটি ব্রিজিং শিরোলেখ তৈরি করুন এবং তারপরে আপনার সুইফট কোডটিতে আপনার উদ্দেশ্য-সি ভিউকন্ট্রোলারটি আরম্ভ করুন (আবার, কেবল আমার উদাহরণ):

var work : WorkaroundViewController = WorkaroundViewController()

তাহলে তুমি শেষ! এটি যদি আপনার পক্ষে কাজ করে তবে আমাকে জানান ... আমি যেমন বলেছিলাম এটি কুৎসিত, তবে কাজ করে!


এটি টিএমপি সমাধান, আমি মনে করি আমাদের আরও ভাল কোনও উপায় খুঁজে পাওয়া বা অপেক্ষা করা উচিত :)
আলেক্সজেড

@ অ্যালেক্সজেড, একেবারে, আমি আশা করি তারা তাড়াতাড়ি অন্তর্ভুক্ত করেছে ... তবে আপাতত, যদি আপনার এটির প্রয়োজন হয় তবে আপনি সেখানে যান!
টিসিডি

4

এটি কেবলমাত্র ইউআইভিউ নয়, ইউআইএআইপিয়ারেন্স প্রোটোকলের সাথে সঙ্গতিপূর্ণ যে কোনও শ্রেণিতেও বাড়ানো যেতে পারে। সুতরাং এখানে আরও জেনেরিক সংস্করণ রয়েছে:

UIAppearance + + Swift.h

#import <UIKit/UIKit.h>

@interface NSObject (UIAppearance_Swift)

+ (instancetype)appearanceWhenContainedWithin:(Class<UIAppearanceContainer>)containerClass;

@end

UIAppearance + + Swift.m

#import "UIAppearance+Swift.h"

@implementation NSObject (UIAppearance_Swift)

+ (instancetype)appearanceWhenContainedWithin:(Class<UIAppearanceContainer>)containerClass {
    if ([self conformsToProtocol:@protocol(UIAppearance)]) {
        return [(id<UIAppearance>)self appearanceWhenContainedIn:containerClass, nil];
    }
    return nil;
}

@end

3

যারা আপনার ব্যবহার করতে চান তাদের জন্য আমি একটি রেপো তৈরি করেছি CocoaPods:

  1. এটি আপনার যুক্ত করুন Podfile:

    pod 'UIViewAppearanceSwift'
  2. আপনার শ্রেণিতে আমদানি করুন:

    import UIViewAppearanceSwift
    
    func layout() {
        UINavigationBar.appearanceWhenContainedWithin(MFMailComposeViewController.self).barStyle = .Black
        UIBarButtonItem.appearanceWhenContainedWithin(UISearchBar.self).setTitleTextAttributes([NSFontAttributeName: UIFont.systemFontOfSize(15)], forState: UIControlState.Normal)
    }
  3. তথ্যসূত্র: https://github.com/levantAJ/UIViewappearanceSwift



0

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


এটি @ স্পিনিলোস পদ্ধতি ব্যবহার করে বিটা 5 এ আমার জন্য কাজ করেছে।
জেসন ক্র্যাম্প

ঠিক আছে, তবে appearanceWhenContainedIn:এখনও টেবিলের বাইরে রয়েছে।
এইচএলএফকোডিং

-3

আপনি এটি ব্যবহার করতে পারেন:

UIBarButtonItem.appearance().setTitleTextAttributes(textDictionary, forState: UIControlState.Normal)

সম্পাদনা করুন: উপস্থিতি যখন কনফিটেডইনটি সুইফটে সরানো হয়েছিল। এই উত্তরটি ছিল বিটা 5 এর জন্য সমস্ত বার বোতামের পাঠ্যের চেহারা পরিবর্তন করতে।


1
এছাড়াও, আপনাকে ব্যবহার করার দরকার নেই UIControlState.Normalকেবল .Normalসুইফট ব্যবহার করতে পারেন অনুমিতি দ্বারা প্রকারটি জানেন।
বেন লাচম্যান

12
এটি সমস্ত ইউআইবারবারটন আইটেমগুলির উপস্থিতি পরিবর্তন করবে, নির্দিষ্টটির জন্য নয়
কোস্টিয়ান্টিন কোভাল

@ কনস্টান্টিনকোভাল অবিকল - এটি উপস্থিতি প্রক্সিগুলির উদ্দেশ্য। আপনি প্রতিটি ভিউ কন্ট্রোলারে বয়লারপ্লেট কোড / পদ্ধতি কলগুলি না রেখে আপনার পুরো অ্যাপ্লিকেশনটিকে স্টাইল করতে পারেন।
ক্রেগ ওটিস

3
এটি আসলে প্রশ্নের উত্তর দেয় না, সুইফটে appearanceWhenContainedInসরানো হয়েছে।
টিম উইন্ডসর ব্রাউন

-7

আপনার মধ্যে Objective-Cবাক্য গঠনটি কেবল অনুবাদ করতে সক্ষম হওয়া উচিতSwift

দ্রুত পদ্ধতিতে এইভাবে ঘোষণা করা উচিত:

func appearanceWhenContainedIn(containerClass : <UIAppearanceContainer>)
func setTitleTextAttributes(_ attributes: NSDictionary!, forState state: UIControlState)

সুতরাং আপনি এটি চেষ্টা করতে পারেন:

UIBarButtonItem.appearanceWhenContainedIn(UINavigationBar).setTitleTextAttributes(textDictionary, forState: UIControlStateNormal)

আমাকে এখনও ক্লাস পদ্ধতিতে কল করার এটি পরিষ্কার উপায় কিনা তা খুঁজে বের করতে হবে Swift

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


1
এই পদ্ধতির উপস্থিতি নেই, যখন দ্রুতগতিতে এটি সংকলনযোগ্য নয়। ত্রুটি: 'UIBarButtonItem.Type' এর 'উপস্থিতি
WenContainIn

হাই @ অ্যালেক্সজেড, আপনার মন্তব্যটি প্রকৃত এক্সকোড 6 বিটার উপর ভিত্তি করে রয়েছে তবে যদি আপনি UIAppearanceপ্রোটোকল ডকুমেন্টেশনের দিকে লক্ষ্য করেন (যার UIBarButtonItemসাথে মানানসই), তবে `উপস্থিতিহাঁস কনটেনইন (_ :) পদ্ধতি বিদ্যমান (এটি এখনও সুইফটে প্রয়োগ করা হয়নি): developer.apple .কম / লাইব্রেরি / প্রিরিলেজ / আইওএস / ডকুমেন্টেশন / ইউআইকিট /…
জেডেনেম

@ জেডেনেম আমি জানি, এটি সত্যিই বোবা এবং আপনি আমাদের বিশ্বাস করতে চান না - তবে এই পদ্ধতিটি আক্ষরিক অর্থে সুইফ্ট থেকে ডাকা যাবে না, ডকুমেন্টেশন চেক করুন: ডেভেলপার.এপ্লে / লাইব্রেরি / আইস / ডকুমেন্টেশন / ইউআইকিট / রেফারেন্স/… - পদ্ধতিটি সুইফ্ট থেকে লুকানো রয়েছে
powerj1984

হাই @ পাওয়ারজ ১৯৮৪, আমি আপনাকে বিশ্বাস করতে চাই না এমন নয়। আমি আমার উত্তরটি যে সময়ে লিখেছিলাম ঠিক তখনই আমি আশা করছিলাম যে এটি কেবল সুইফটের বিটার স্থিতির কারণে to পদ্ধতিটি অবমূল্যায়ন করা হয়নি তবে কেবল সুইফ্ট থেকে লুকানো সত্যই অদ্ভুত, এবং অ্যাপলের কোনও ব্যাখ্যা না পাওয়া এটিকে আরও খারাপ করে তোলে ... তবে আপনি ঠিক বলেছেন, কেন আমি বুঝতে পারছি না, আমার উত্তর ভূল. সম্ভবত
সুইফটে

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